21007


Javaに限った話では無いのかもしれませんが、単体テストを実装する際には、

  * 関連するクラスのスタブやモックの作成コードのテスト準備コード
  * テスト実行のコード
  * assertionのコード

を記載していくかと思います。  
だんだんとテストを書いていくと、上記3つが混ざってくる気がしています。

そこで、上記3つの内容が一目で分かるようなテストライブラリを探しているのですが、  
ご存じの方は教えてください。

ライブラリのコードイメージは下記のようになります。

[code]

    @Test
    public void testHoge(){
       TestHelper.prepare({
          Hoge hoge = mock(Hoge.class)
          when(hoge.getXXX).thenReturn("hogehoge");
       }).execute({
          result(test.target());
       }).evaluate(r -> {
          assertEquals(r, "expected");
       });
    }
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2016-01-16T16:36:30.857
20984
2018-07-19T00:44:11.070
3355
question
java junit
Javaのテストでstub(mock)/テスト実行/assertionを綺麗に書きたい


xUnit Test Patternsで言う、"Four Phase
Test"を強制＆明示できるテスティングフレームワークを探している、ということですね。Javaそのものではありませんが、Groovyで記述するSpockというテスティングフレームワークででは、まさにそのような記述が可能になっています。

SpockではテストコードをGroovyで記述しますが、テスト対象のプロダクトコードはJavaで記述されていても問題ありません。

たとえば、質問にあるような疑似テストコードをSpock風に書くと以下のようになります。

[code]

    void "test of hoge"() {
        given: // 関連するクラスのスタブやモックの作成コードのテスト準備コード
        Hoge hoge = Mock(Hoge)
        hoge.getXXX() >> "hogehoge"
        test.hoge = hoge
    
        when: // テスト実行のコード
        def result = test.target()
    
        then: // assertionのコード
        result == "expected"
    }
    
[/code]

Spockでは、

  * ラベルによるFour Phase Testに従った記法
  * Power Assertによるverifyの簡素化＆NG時の詳細表示
  * 強力なParamterized Testサポート
  * 標準でモック＆スタブをサポート
  * Javaと親和性の高いGroovyによる柔軟な記述

などの特徴があります。

詳しい情報は、下記のURLからどうぞ。

  * <https://github.com/yamkazu/spock-workshop/tree/master/docs>
  * <https://spock-framework-reference-documentation-ja.readthedocs.org/ja/latest/>


CC BY-SA 3.0
2016-01-17T13:18:50.810
21007
2016-01-17T13:18:50.810
2356
20984
answer