は次のようになります。テストの意志が静的イニシャライザを無効にするにはどうすればよいですか?テスト中の私のシステムを想定すると、
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
/@BeforeClass
でnew MockUp<Trouble>(){@Mock void $clinit(){} };
を追加
で失敗した、と
@Mocked Trouble trouble;
を保ちます。DummyTest
クラスがロードされた後モックアップアクションが起こるので、それは、静的な初期化中にTestSuite
に新たなモックアップを追加を例外をスローし、スイートに
DummyTest
を呼び出します(無修正)Trouble
クラスをロードする、機能していないようです同様の問題が発生しました。20, 30
を偽のクラスに返す動作を入れて、Expectations/Verifications
の使用を削除しますが、どのインスタンスでどのパラメータが呼び出されたかを確認する方法がありません。
私の問題を解決する良い方法はありますか?実際には私はExpectaitons/Verifications
を使い続けたいと思います。単体テスト中にスタティックイニシャライザを無効にする方法があります。
この機能が欠けているとは思いません。それはまさに私が期待していることです! –
簡単に答えてくれてうれしいです。 :) – pmcevoy12