次に、テスト対象のクラスを実装します。まずは、インターフェースについて仕様を決めて空実装します。名前の追加機能と、リストアップの機能が必要なので、以下のように実装します。
package com.example;
import java.util.ArrayList;
import java.util.List;
/**
* 従業員名簿クラスです。
*/
public class PayRoll {
/**
* 従業員を登録します。
*
* @param name
* 名前
*/
public void register(String name) {
}
/**
* 従業員の名前一覧を取得します。
*
* @return 名前一覧
*/
public List getNames() {
return new ArrayList();
}
}
上記のクラスを「src/main/java」以下の「com.example」パッケージへ配置します。PayRollクラスのメソッドのスケルトンが作成できたので、それを踏まえて、先ほど作成したStepクラスに検証ロジックを追加します。
package com.example;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Named;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;
public class AddPayRollSteps {
private PayRoll payRoll;
@Given("空の従業員名簿を作成します")
public void givenAPayRoll() {
payRoll = new PayRoll();
}
@When("<name>を追加します")
public void whenRegister(@Named("name")String name) {
payRoll.register(name);
}
@Then("<name>が追加されていること")
public void thenTheContainsShould(@Named("name")String name) {
assertThat(payRoll.getNames().isEmpty(), is(false));
assertThat(payRoll.getNames().get(0), is(name));
}
}
以上で、JBehaveを動かすために必要なものが一通り揃いましたので、早速JBehaveを起動します。以下のコマンドで起動することができます。
$ mvn verify
もちろん未実装なので、テストは失敗します。コンソールには以下のように出力されます。
(BeforeStories)
Running story com/example/payroll_stories.story
(com/example/payroll_stories.story)
Scenario: 従業員名簿に名前を追加します
Examples:
Given 空の従業員名簿を作成します
When <name>を追加します
Then <name>が追加されていること
|name|
|徳川家康|
Example: {name=徳川家康}
Given 空の従業員名簿を作成します
When 徳川家康を追加します
Then 徳川家康が追加されていること (FAILED)
(java.lang.AssertionError:
Expected: is <false>
but: was <true>)
(AfterStories)
Thenの段階で失敗していることが分かります。従業員名簿に名前を追加したのですが、追加した値が名簿から取得できなかったようです。次に要求仕様を踏まえて、テストが通るようにPayRollクラスを実装します。
public class PayRoll {
private List names = new ArrayList();
/**
* 従業員を登録します。
*
* @param name
* 名前
*/
public void register(String name) {
names.add(name);
}
/**
* 従業員の名前一覧を取得します。
*
* @return 名前一覧
*/
public List getNames() {
return new ArrayList(names);
}
}
以上のように、実装を修正したうえで、再度テストを起動します。今度は、「BUILD SUCCESS」と表示され、テストが通ります。
まとめ
BDDのGiven-When-Thenを軸にした設計によって、HowからWhatへフォーカスしたテストを行うことが可能になります。
昨今注目されているドメイン駆動設計など、設計から実装へのトレーサビリティをより向上させようとする動きが盛んですが、同じくBDDもアプリケーションの構造を改善していくのに寄与すると思います。
