2014年12月22日月曜日

2015年1月(冬)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。


曜日 タイトル 初回放送日時 放送局
Go!プリンセスプリキュア 2月1日(日) 8:30 テレビ朝日
純潔のマリア 1月11日(日) 22:30 TOKYO MX
ユリ熊嵐 1月5日 24:30 TOKYO MX
神様はじめました◎ 1月5日(月) 26:05 テレビ東京
憑物語 12月31日(水) 22:00 TOKYO MX
艦隊これくしょん -艦これ- 1月7日(水) 25:05 TOKYO MX
冴えない彼女(ヒロイン)の育てかた 1月8日(木) 24:50 フジテレビ
幸腹グラフィティ 1月8日(木) 25:46 TBS
アイドルマスターシンデレラガールズ 1月9日(金) 24:00 TOKYO MX
ジョジョの奇妙な冒険 スターダストクルセイダース エジプト編 1月9日(金) 24:30 TOKYO MX

時間がカッコ付きの物は、カッコの方が通常の放送時間。

とりあえず、憑物語とアイマス。
幾原邦彦監督のユリ熊嵐も気になるところ。
艦これのアニメが果たしてどうかという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2015年冬季開始の新作アニメ一覧

楽描喜堂

2014年9月27日土曜日

2014年10月(秋)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。


曜日 タイトル 初回放送日時 放送局
天体のメソッド 10月5日(日) 22:30 TOKYO MX
グリザイアの果実 10月5日(日) 24:30 TOKYO MX
繰繰れ!コックリさん 10月5日(日) 25:05 テレビ東京
ガールフレンド(仮) 10月5日(日) 25:35 テレビ東京
愛・天地無用! 10月6日(月)~(金) 21:55 TOKYO MX
弱虫ペダル GRANDE ROAD 10月6日(月) 25:35 テレビ東京
異能バトルは日常系のなかで 10月6日(月) 26:05 テレビ東京
大図書館の羊飼い 10月8日(水) 24:30 TOKYO MX
デンキ街の本屋さん 10月2日(木) 22:30 TOKYO MX
SHIROBAKO 10月9日(木) 23:30 TOKYO MX
甘城ブリリアントパーク 10月2日(木) 26:04(26:16) TBS
selector spread WIXOSS 10月3日(金) 25:05 TOKYO MX
ガンダム Gのレコンギスタ 10月3日(金) 25:55 TBS
結城友奈は勇者である 10月17日(金) 26:40(26:25) TBS
Fate/stay night [Unlimited Blade Works] 10月4日(土) 24:00 TOKYO MX
蟲師 続章 後半エピソード 10月18日(土) 24:30 TOKYO MX
失われた未来を求めて À la recherche du futur perdu 10月4日(土) 25:00 TOKYO MX

時間がカッコ付きの物は、カッコの方が通常の放送時間。

ufotable制作のFate/stay night、水島努監督×P.A.WORKSのSHIROBAKOに期待しています。
他には蟲師やselector、天地無用の新作がどうかという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2014年春季開始の新作アニメ一覧

楽描喜堂

2014年9月21日日曜日

Eclipseの起動引数にdataを指定して起動しない

Windowsでワークスペースを指定する為、以下のように指定したら起動しなかった。
C:\eclipse\eclipse.exe -data "C:\workspace\"
C:\eclipse\eclipse.exe -data "C:\workspace"

data引数の最後の\を取ったら、ちゃんと起動した。

2014年6月21日土曜日

2014年7月(夏)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。

曜日 タイトル 初回放送日時 放送局
人生相談テレビアニメーション「人生」 7月6日(日) 22:00 TOKYO MX
さばげぶっ! 7月6日(日) 22:30 TOKYO MX
スペース☆ダンディ シーズン2 7月6日(日) 23:00 TOKYO MX
ハナヤマタ 7月7日(月) 25:35 テレビ東京
ヤマノススメ セカンドシーズン 7月9日(水) 22:00 TOKYO MX
まじもじるるも 7月9日(水) 24:00 TOKYO MX
Fate/kaleid liner プリズマ☆イリヤ 2wei(ツヴァイ)! 7月9日(水) 25:35 TOKYO MX
グラスリップ 7月3日(木) 22:30 TOKYO MX
RAIL WARS! 7月3日(木) 25:46 TBS
普通の女子校生が【ろこどる】やってみた。 7月3日(木) 26:16 TBS
六畳間の侵略者!? 7月11日(金) 25:05 TOKYO MX
ばらかもん 7月5日(土) 26:20 日本テレビ

P.A.WORKSの新作グラスリップに期待しています。
true tearsの西村純二監督という事もあり楽しみです。
それ以外は、適当に視聴できるときに見るという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2014年春季開始の新作アニメ一覧

楽描喜堂

JavaでjQueryで扱うIDをエスケープする

Webアプリケーションフレームワークの都合上、動的に生成されるIDをjQueryで処理する必要があり、
そのIDを予めjQueryでも扱えるようエスケープした状態のIDを作成する必要がありました。
そこで、以下のようなユーティリティークラスを作成しました。

jQueryのエスケープに関しては、下記にあります。
jQuery API Documentation Category: Selectors

package util;

/**
 * jQueryユーティリティー
 * @author @michigawi
 */
public final class JQueryUtil {

 /** エスケープ対象文字 */
 private static final char[] META_CHARACTERS = new char[]{' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '`', '{', '|', '}', '~'};

 /** jQueryのエスケープ文字 */
 private static final String ESCAPE_META = "\\\\";

 /**
  * エスケープします。

  * http://api.jquery.com/category/selectors/
  * @param target ターゲットの文字
  * @return エスケープ後の文字列
  */
 public static final String escape(String target) {
  if (target == null) {
   return null;
  }

  StringBuilder escaped = new StringBuilder(target.length() * 2);

  for (char character : target.toCharArray()) {
   if (findEscapeTarget(character)) {
    escaped.append(ESCAPE_META);
   }

   escaped.append(character);
  }

  return escaped.toString();
 }

 /**
  * 文字列がエスケープ対象か判別します。
  * @param target ターゲットの文字
  * @return エスケープ対象の場合、true
  */
 private static boolean findEscapeTarget(char target) {
  for (char meta : META_CHARACTERS) {
   if (target == meta) {
    return true;
   }
  }

  return false;
 }
}

テストコード
package util;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;

/**
 * {@link util.JQueryUtilTest}のテスト
 * @author @michigawi
 */
public class JQueryUtilTest {

 @Test
 public void 半角スペースをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery selector"), is("jQuery\\\\ selector"));
 }

 @Test
 public void 半角エクスクラメーションマークをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery!selector"), is("jQuery\\\\!selector"));
 }

 @Test
 public void ダブルクウォートをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery\"selector"), is("jQuery\\\\\"selector"));
 }

 @Test
 public void シャープをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery#selector"), is("jQuery\\\\#selector"));
 }

 @Test
 public void ダラーをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery$selector"), is("jQuery\\\\$selector"));
 }

 @Test
 public void パーセントをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery%selector"), is("jQuery\\\\%selector"));
 }

 @Test
 public void アンドをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery&selector"), is("jQuery\\\\&selector"));
 }

 @Test
 public void シングルクォートをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery'selector"), is("jQuery\\\\'selector"));
 }

 @Test
 public void 左丸カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery(selector"), is("jQuery\\\\(selector"));
 }

 @Test
 public void 右丸カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery)selector"), is("jQuery\\\\)selector"));
 }

 @Test
 public void アスタリスクをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery*selector"), is("jQuery\\\\*selector"));
 }

 @Test
 public void プラスをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery+selector"), is("jQuery\\\\+selector"));
 }

 @Test
 public void カンマをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery,selector"), is("jQuery\\\\,selector"));
 }

 @Test
 public void ピリオドをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery.selector"), is("jQuery\\\\.selector"));
 }

 @Test
 public void スラッシュをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery/selector"), is("jQuery\\\\/selector"));
 }

 @Test
 public void コロンをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery:selector"), is("jQuery\\\\:selector"));
 }

 @Test
 public void セミコロンをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery;selector"), is("jQuery\\\\;selector"));
 }

 @Test
 public void 小なり記号をエスケープする() {
  assertThat(JQueryUtil.escape("jQueryselector"), is("jQuery\\\\>;selector"));
 }

 @Test
 public void クエッションをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery?selector"), is("jQuery\\\\?selector"));
 }

 @Test
 public void アットマークをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery@selector"), is("jQuery\\\\@selector"));
 }

 @Test
 public void 左大カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery[selector"), is("jQuery\\\\[selector"));
 }

 @Test
 public void バックスラッシュをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery\\selector"), is("jQuery\\\\\\selector"));
 }

 @Test
 public void 右大カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery]selector"), is("jQuery\\\\]selector"));
 }

 @Test
 public void キャレットをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery^selector"), is("jQuery\\\\^selector"));
 }

 @Test
 public void グレイヴアクセントをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery`selector"), is("jQuery\\\\`selector"));
 }

 @Test
 public void 左中カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery{selector"), is("jQuery\\\\{selector"));
 }

 @Test
 public void 縦線をエスケープする() {
  assertThat(JQueryUtil.escape("jQuery|selector"), is("jQuery\\\\|selector"));
 }

 @Test
 public void 右中カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery}selector"), is("jQuery\\\\}selector"));
 }

 @Test
 public void チルダをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery~selector"), is("jQuery\\\\~selector"));
 }
}

2014年3月22日土曜日

2014年4月(春)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。


曜日 タイトル 初回放送日時 放送局
極黒のブリュンヒルデ 4月6日(日) 22:00 TOKYO MX
ラブライブ! School idol project 2期 4月6日(日) 22:30 TOKYO MX
彼女がフラグをおられたら 4月6日(日) 24:30 TOKYO MX
マンガ家さんとアシスタントさんと 4月7日(月) 25:05 TOKYO MX
ソウルイーターノット! 4月8日(火) 26:00(25:40) テレビ東京
棺姫のチャイカ 4月9日(水) 25:05 TOKYO MX
エスカ&ロジーのアトリエ~黄昏の空の錬金術士~ 4月10日(木) 22:00 TOKYO MX
ご注文はうさぎですか? 4月10日(木) 22:30 TOKYO MX
ピンポン THE ANIMATION 4月10日(木) 24:50(24:20) フジテレビ
龍ヶ嬢七々々の埋蔵金 4月10日(木) 25:30(25:20) フジテレビ
僕らはみんな河合荘 4月3日(木) 26:16 TBS
監督不行届 4月(金) 22:25 AT-X
蟲師 続章 4月4日(金) 24:00 TOKYO MX
ジョジョの奇妙な冒険 スターダストクルセイダース 4月4日(金) 24:30 TOKYO MX
selector infected WIXOSS 4月4日(金) 25:05 TOKYO MX
デート・ア・ライブⅡ 4月11日(金) 25:35 TOKYO MX
レディ ジュエルペット 4月5日(土) 9:30 テレビ東京
魔法科高校の劣等生 4月5日(土) 24:30 TOKYO MX

時間がカッコ付きの物は、カッコの方が通常の放送時間。

とりあえず、蟲師。
それ以外は、適当に視聴できるときに見るという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2014年春季開始の新作アニメ一覧

MOON PHASE 雑記 2014年春アニメ新番チェック

楽描喜堂

2014年3月15日土曜日

Copy Paste Detector(CPD)の解析結果をHTMLにする。

CPDで解析した結果はそのままでは見難いので、
antのタスクで解析からHTML出力まで行います。
HTMLにする際、XSLTテンプレートがPMDに含まれているので、
それを利用します。
ディレクトリ構成は以下の通りです。

/
  /pmd-bin-5.1.0/
  /commons-net-3.3-src/
  /apache-ant-1.8.4/
  build.xml
  cpdExec.bat

以下は、antのbuild.xmlファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<project name="CPD" default="analysis" basedir=".">
  <path id="cpd.lib">
    <fileset dir="./pmd-bin-5.1.0/lib">
      <include name="*.jar"/>
    </fileset>
  </path>
  <taskdef name="cpd" classpathref="cpd.lib" classname="net.sourceforge.pmd.cpd.CPDTask"/>
  <target name="analysis">
    <antcall target="cpd" />
    <antcall target="xslt" />
  </target>
  <target name="cpd">
    <cpd encoding="UTF-8" minimumTokenCount="100" format="xml" language="java" outputFile="cpd.xml">
         <fileset dir="./commons-net-3.3-src/src/main/java">
             <include name="**/*.java"/>
         </fileset>
     </cpd>
  </target>
  <target name="xslt">
    <xslt in="cpd.xml" style="./pmd-bin-5.1.0/etc/xslt/cpdhtml.xslt" out="cpd.html" />
  </target>
</project>

batファイルは、以下のように記述します。

setlocal
set JAVA_HOME=%ProgramFiles%\Java\jdk1.7.0_51
set ANT_HOME=./apache-ant-1.8.4
"%ANT_HOME%\bin\ant.bat"
pause

HTMLは以下のような感じになります。

Copy Paste Detector(CPD)

Copy Paste Detector(CPD)でソースコードの重複(コピペ)を発見する。

様々なプログラミング言語を解析するPMDにあるCPDを利用します。
以下は、ディレクトリ構成です。
/
  /pmd-bin-5.1.0/
  /commons-net-3.3-src/
  cpdExec.bat

今回は、Apache CommonsのNetコンポーネントを解析に利用しました。
以下のようにbatファイルを記述します。
setlocal
set JAVA_HOME=%ProgramFiles%\Java\jdk1.7.0_51
set CLASSPATH=./pmd-bin-5.1.0/lib/ant-1.8.1.jar;./pmd-bin-5.1.0/lib/ant-launcher-1.8.1.jar;./pmd-bin-5.1.0/lib/ant-testutil-1.7.1.jar;./pmd-bin-5.1.0/lib/asm-5.0_BETA.jar;./pmd-bin-5.1.0/lib/commons-io-2.2.jar;./pmd-bin-5.1.0/lib/commons-lang3-3.1.jar;./pmd-bin-5.1.0/lib/dom4j-1.6.1.jar;./pmd-bin-5.1.0/lib/javacc-5.0.jar;./pmd-bin-5.1.0/lib/jaxen-1.1.1.jar;./pmd-bin-5.1.0/lib/jcommander-1.27.jar;./pmd-bin-5.1.0/lib/jdom-1.0.jar;./pmd-bin-5.1.0/lib/junit-4.4.jar;./pmd-bin-5.1.0/lib/pmd-5.1.0.jar;./pmd-bin-5.1.0/lib/rhino-1.7R3.jar;./pmd-bin-5.1.0/lib/saxon-9.1.0.8-dom.jar;./pmd-bin-5.1.0/lib/saxon-9.1.0.8.jar;./pmd-bin-5.1.0/lib/xercesImpl-2.9.1.jar;./pmd-bin-5.1.0/lib/xml-apis-1.3.02.jar;./pmd-bin-5.1.0/lib/xmlParserAPIs-2.6.2.jar;./pmd-bin-5.1.0/lib/xom-1.0.jar
"%JAVA_HOME%\bin\java.exe" -Xmx512m net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files ./commons-net-3.3-src/src/main/java --encoding utf-8 --format xml
pause

実行する際、解析結果をファイルに保存する為、標準出力をリダイレクトします。
cpdExec.bat > cpd.xml

2014年1月3日金曜日

CodeIQ MAGAZINE「現在時刻が関わるテストから、テスト容易性設計を学ぶ」を解いてみた

CodeIQ MAGAZINE これであなたもテスト駆動開発マスター!?和田卓人さんがテスト駆動開発問題を解答コード使いながら解説します~現在時刻が関わるテストから、テスト容易性設計を学ぶ #tdd

読んでみたら、参加言語とアプローチの内訳に、Javaで「現在時刻を引数で渡す」アプローチがなかったので、書いてみました。

以下は実装です。
package tdd;

import java.util.Calendar;
import java.util.Date;

/**
 * 挨拶をするクラスです。
 * @author michigawi
 */
public class Greeter {

 /**
  * 挨拶します。
  * @param date 日時
  * @return 挨拶
  */
 public String greet(Date date) {
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);

  int hour = cal.get(Calendar.HOUR_OF_DAY);
  int minute = cal.get(Calendar.MINUTE);
  int second = cal.get(Calendar.SECOND);

  for (Greeting greeting : Greeting.values()) {
   if (greeting.valid(hour, minute, second)) {
    return greeting.getGreeting();
   }
  }

  return null;
 }

 /**
  * 挨拶です。
  * @author michigawi
  */
 private enum Greeting {
  /** 朝 */
  MORNING("おはようございます") {
   @Override
   public boolean valid(int hour, int minute, int second) {
    if (hour >= 5 && (hour <= 11 && minute <= 59 && second <= 59)) {
     return true;
    }

    return false;
   }
  }
  /** 日中 */
  , AFTERNOON("こんにちは") {
   @Override
   public boolean valid(int hour, int minute, int second) {
    if (hour >= 12 && (hour <= 17 && minute <= 59 && second <= 59)) {
     return true;
    }

    return false;
   }
  }
  /** 夜 */
  , NIGHT("こんばんは") {
   @Override
   public boolean valid(int hour, int minute, int second) {
    if (hour >= 18 && (hour <= 23 && minute <= 59 && second <= 59)) {
     return true;
    }

    if (hour >= 0 && (hour <= 4 && minute <= 59 && second <= 59)) {
     return true;
    }

    return false;
   }
  };

  /** 挨拶するか */
  public abstract boolean valid(int hour, int minute, int second);

  /** 挨拶 */
  private String greeting;

  /**
   * コンストラクタです。
   * @param greeting
   */
  Greeting(String greeting) {
   this.greeting = greeting;
  }

  /**
   * 挨拶を返します。
   * @return 挨拶
   */
  public String getGreeting() {
   return greeting;
  }
 }
}
最後にテストです。
package tdd;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.util.Calendar;

import org.junit.Before;
import org.junit.Test;

/**
 * {@link tdd.Greeter}のテストです。
 * @author michigawi
 */
public class GreeterTest {

 /** テスト対象のクラス */
 private Greeter greeter;

 /** カレンダー */
 private Calendar calendar;

 /**
  * setup.
  */
 @Before
 public void setUp() {
  greeter = new Greeter();
  calendar = Calendar.getInstance();
  calendar.clear();
  calendar.set(2014, Calendar.JANUARY, 3);
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午前0時ジャストはこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 0);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午前5時より前はこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 4);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午前5時ジャストはおはようございます() {
  calendar.set(Calendar.HOUR_OF_DAY, 5);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("おはようございます"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 正午の前はおはようございます() {
  calendar.set(Calendar.HOUR_OF_DAY, 11);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  assertThat("", greeter.greet(calendar.getTime()), is("おはようございます"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 正午はこんにちは() {
  calendar.set(Calendar.HOUR_OF_DAY, 12);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんにちは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午後6時より前はこんにちは() {
  calendar.set(Calendar.HOUR_OF_DAY, 17);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  assertThat("", greeter.greet(calendar.getTime()), is("こんにちは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午後6時ジャストはこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 18);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void _24時はこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 24);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }
}

様々なアプローチがあるんだなぁと思いました。