J8SpecでBDDスタイルのテスト

2016.03.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Java8でBDDスタイルのテストをする

J8Specライブラリ

J8Specは、(RSpec)[http://rspec.info/]や(jasmine)[http://jasmine.github.io/]のように、
Java8でBDDスタイルを使ってテストを記述することができるようになるユニットテストライブラリです。
JUnit runnerを使っているので、IDEから使用することも可能です。

環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.10.5
  • Java : 1.8.0_51
  • Gradle : 2.5

J8Specのサンプル作成

1.プロジェクト作成
ではJ8Specを使ってみます。gradle用プロジェクトを作成後、
下記 のようにbuild.gradleを記述し、j8specライブラリを追加します。

defaultTasks 'clean', 'check'

apply plugin: 'java'

group = 'io.github.j8spec'
version = '3.0.0'

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

repositories {
    mavenCentral()

    maven {
        url 'https://oss.sonatype.org/content/repositories/snapshots'
    }
}

dependencies {
    testCompile group: 'io.github.j8spec', name: 'j8spec', version: '3.0.0'
}

test {
    systemProperties = System.properties
}

2.テスト対象クラス作成
テスト対象となるCalculatorクラスを作成します。

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }


    public int divide(int dividend, int divisor) {
        if (divisor == 0) {
            throw new IllegalArgumentException();
        }
        return 0;
    }

    public boolean isPrime(int value) throws InterruptedException {
        Thread.sleep(250);
        return false;
    }
}

3.テストクラス作成
ではテストクラスを作成してみます。
@RunWithアノテーションでJ8SpecRunnerを指定し、j8spec.J8Specクラスのdescribe(context)やitを使用して
BDDスタイルでテストを記述しています。  

・
・
@RunWith(J8SpecRunner.class)
public class MyCalculatorTest {{

    //contextでも同じ
    describe("operations", () -> {
        it("adds two integers", () -> {
            assertThat(var(calc).add(1,2), is(3));
        });
    });

}}

assertはJUnitのものを使用しています。

例外発生をテスト成功条件にするには、下記のように第2引数に指定します。

・
・   
    //IllegalArgumentExceptionがthrowされればテスト成功
    it("does not divide by zero", c -> c.expected(IllegalArgumentException.class), () -> {
        Calculator calculator = new Calculator("");
        calculator.divide(10, 0);
    });
・
・

J8SpecのもつVarラッパーを使用すれば、フィールド変数についてテスト毎の状態を考慮する必要がなくなり、
ローカル変数と同じ感覚で使用できます。

・
・    
    Var<Calculator> calc = var();

    //テスト実施前に実行
    beforeEach(() -> {
        var(calc, new Calculator());
    });

    describe("operations", () -> {
        it("adds two integers", () -> {
            assertThat(var(calc).add(1,2), is(3));
        });
    });

}}
・
・

まとめ

Javaで簡単にBDDスタイルを用いてテストを記述できました。
このスタイルでユニットテストを書きたい人は、このライブラリを使ってみてください。