2016-08-25 3 views
1

は次のようになります。テストの意志が静的イニシャライザを無効にするにはどうすればよいですか?テスト中の私のシステムを想定すると、

public class DummyTest { 

    @Tested SysUnderTest sut; 
    @Mocked Trouble trouble; 

    @Test 
    public void testTrouble() { 
     new Expectations() {{ 
      trouble.water(anyInt); returns(10, 20); 
     }}; 

     assertThat("mocked result", sut.foo(), is(30)); 

     new FullVerificationsInOrder() {{ 
      Trouble t1 = new Trouble(); 
      Trouble t2 = new Trouble(); 
      t1.water(1); 
      t2.water(2); 
     }}; 
    } 
} 

のようになります

public class SysUnderTest { 
    public int foo() { 
     Trouble trouble1 = new Trouble(); 
     Trouble trouble2 = new Trouble(); 
     return trouble1.water(1) + trouble2.water(2); 
    } 
} 

しかし、Troubleは実際に私が制御することはできませんサードパーティ製のlibクラスで、テストで失敗する静的初期化を行います。

public class Trouble { 
    static { 
     troubleInitialize(); 
    }; 

    public int water(int i) { 
     return 0; 
    } 

    private static void troubleInitialize() { 
     throw new RuntimeException("Trouble"); 
    } 
} 

私は、静的初期化子を取り除くためにMockUp<Trouble>を使用することができます知っているが、私は(私の現実的な場合には)二つの新しいを区別できるようにしたいと私は場合には、それを利用するためにどのよう見当がつかないインスタンス(SysUnderTestで作成)を呼び出し、呼び出しを検証します。私はさまざまな方法を試してみましたが、すべては、いくつかの理由@Before/@BeforeClassnew MockUp<Trouble>(){@Mock void $clinit(){} };を追加

  1. で失敗した、と@Mocked Trouble trouble;を保ちます。 DummyTestクラスがロードされた後モックアップアクションが起こるので、それは、静的な初期化中にTestSuiteに新たなモックアップを追加

  2. を例外をスローし、スイートにDummyTestを呼び出します(無修正)Troubleクラスをロードする、機能していないようです同様の問題が発生しました。

  3. 20, 30を偽のクラスに返す動作を入れて、Expectations/Verificationsの使用を削除しますが、どのインスタンスでどのパラメータが呼び出されたかを確認する方法がありません。

私の問題を解決する良い方法はありますか?実際には私はExpectaitons/Verificationsを使い続けたいと思います。単体テスト中にスタティックイニシャライザを無効にする方法があります。

答えて

2

Mockedを使用する場合、模擬クラスの静的initを空のメソッドに変更するには、stubOutClassInitializationを使用します。

@Mocked(stubOutClassInitialization=true) Trouble trouble; 
+0

この機能が欠けているとは思いません。それはまさに私が期待していることです! –

+0

簡単に答えてくれてうれしいです。 :) – pmcevoy12

関連する問題