辞書を片手に~PatternResponderの作成(12)
まだまだリファクタリングを続ける。
ToDoリスト
・PatternReponderのloadDictionaryPattern()とloadDictionaryResponse()がテストからしか呼ばれていない
本当に、これらのメソッドがまだ必要なのかを検討する。
とくにこれらを呼んでいるテストが変われば、さらに不要なコンストラクタが削減される可能性がある。
まずは、loadDictionaryPattern()のテスト。
PatternResponderTest:
public void testLoadDictionaryPattern() throws FileNotFoundException {
PatternResponder responder = new PatternResponder("pattern",
new Dictionary(new FileReader("dics/pattern.txt")));
assertEquals(new Pattern[] { Pattern.compile("今日はさむいね"),
Pattern.compile("チョコたべたい"), Pattern.compile("きのう10円ひろった") },
responder.loadDictionaryPattern());
}
この使用方法からloadDictionaryPattern()を簡単に削除しようとしたら、patternsを公開するぐらいしか思いつかない。
loadDicrionaryResponse()のテストも見てみる。
PatternResponderTest:
public void testLoadDictionaryResponse() throws FileNotFoundException {
PatternResponder responder = new PatternResponder("pattern",
new Dictionary(new FileReader("dics/pattern.txt")));
assertEquals(
new RandomResponder[] {
new RandomResponder("", new Dictionary(new String[] {
"さむくないよ", "そうだね" })),
new RandomResponder("", new Dictionary(
new String[] { "食べれば" })),
new RandomResponder("", new Dictionary(
new String[] { "いいね" })) }, responder
.loadDictionaryResponse());
}
現状では、PatternとResponseをばらばらにテストしている。これをパターン-応答例をセットでテストすることにして、loadDictionary*()は削除することにしても良いが、そうするとこのクラスは適当な入力に対して適切な応答を返すかどうかでしかテストできなくなる。
つまり、現状は内部仕様をテストしているが、それを一切見ないようにするかどうかを判断する必要にせまられているわけだ。
内部仕様を隠蔽することを選んだ場合は、単純に上記テストを削除するだけだが、それで不安はないだろうか?
自問自答した結果、全ての入力に対する応答をカバーするテストがあるならば不安じゃないんじゃないか、と考える。既に存在するテストを眺めた結果、正常系のresponse()のテストが、
assertEquals("さむくないよ", resp.response("今日はさむいね"));
しか存在しないことに気づいた。テストを拡充する。
assertEquals("さむくないよ", resp.response("今日はさむいね"));
assertEquals("そうだね", resp.response("今日はさむいね"));
assertEquals("食べれば", resp.response("チョコたべたい"));
assertEquals("いいね", resp.response("きのう10円ひろった"));
これでテスト実行。Green。不安が減った気がするので、loadDictionary*()のテストを削除する。
その結果、呼び出されることがなくなったメソッドを削除する。