さすがに分けないとと苦しい感じだったので前回と同じ題目「FizzBuzz」の残りの内の一つJava&JUnit4で実装したコードを乗せておきます。TDDは初心者ですので「こうした方がいいよ」などというアドバイスがあればコメントに書いていただければ幸いです。(どさどさ来たら、うれしい悲鳴が上がりますが…)
public class FizzBuzz { private int currentNumber; public FizzBuzz(int startNumber){ currentNumber = startNumber; } public String says(){ if(currentNumber % 3 == 0 && currentNumber % 5 == 0){ return "FizzBuzz"; } if(currentNumber % 3 == 0){ return "Fizz"; } else if(currentNumber % 5 == 0){ return "Buzz"; } else{ return Integer.toString(currentNumber); } } public void increment(){ currentNumber++; } public void decrement(){ currentNumber--; } public void setCurrentNumber(int num){ currentNumber = num; } public int getCurrentNumber(){ return currentNumber; } }
import org.junit.Test; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; public class FizzBuzzTest { private FizzBuzz fb; @Test public void 三の倍数でも五の倍数でもない場合(){ fb = new FizzBuzz(1); assertThat(fb.says(), is("1")); } @Test public void 三の倍数の場合(){ fb = new FizzBuzz(3); assertThat(fb.says(), is("Fizz")); } @Test public void 五の倍数の場合(){ fb = new FizzBuzz(5); assertThat(fb.says(), is("Buzz")); } @Test public void 三と五の倍数の場合(){ fb = new FizzBuzz(15); assertThat(fb.says(), is("FizzBuzz")); } @Test public void 数字をインクリメントした場合(){ fb = new FizzBuzz(1); fb.increment(); assertThat(fb.says(), is("2")); } @Test public void 数字をデクリメントした場合(){ fb = new FizzBuzz(2); fb.decrement(); assertThat(fb.says(), is("1")); } @Test public void 現在の数字を変更した場合(){ fb = new FizzBuzz(1); fb.setCurrentNumber(2); assertThat(fb.says(), is("2")); } @Test public void 現在の数字を取得した場合(){ fb = new FizzBuzz(1); assertThat(fb.getCurrentNumber(), is(1)); } }
FizzBuzzTest.java
なかなか慣れないと「テストコードから先に書く」というのを忘れてしまいがちです。「レッド→グリーン→リファクタリング」という一連の流れが身に着くまでにはもう少し時間がかかりそうですが、そのための練習でもあるのでこういう練習を続けていくことができたらいいなと思ってます。
ちなみに自分で言うのも何ですが、increment()やdecrement()のテストはgetCurrentNumber()を用いた方がいいと思います。今回は後でgetCurrentNumber()を実装したのでこのようなテストコードになっています。(修正すればいいのに、っていうのはナシでお願いします)