PowermockとMockitoを使用してvoid静的メソッドをモックして、以下のように例外をスローしようとしています。しかし、私は問題に遭遇しました。同じ引数でAdder.add()の2つの呼び出しを行わない限り、モックされたIOException
はスローされません。
ところで、ユニットテストクラスに@RunWith(PowerMockRunner.class)
と@PrepareForTest(Adder.class)
を追加しました。
class Adder{
public static void add(int i) throws IOException{
return;
}
}
@Test
public void testAdder() throws IOException{
PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(12);
try {
Adder.add(11);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// assert things
}
前もって感謝します。 :)
回答は以下の通りです
ここを参照した後 http://code.google.com/p/powermock/issues/detail?id=278 、実際、上記のAdder.add(12)はモック静的メソッドの設定の一部です。つまり、引数12を指定してAdder.add()を呼び出すと、IOExceptionがスローされます。分かりづらいですよね? :)それで、それは以下のように書かれるべきです。
PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(anyInt());
回答は以下の通りです
ここを参照した後 http://code.google.com/p/powermock/issues/detail?id=278 、実際、上記のAdder.add(12)はモック静的メソッドの設定の一部です。つまり、引数12を指定してAdder.add()を呼び出すと、IOExceptionがスローされます。分かりづらいですよね? :)それで、それは以下のように書かれるべきです。
PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(anyInt());
編集:
リンクが無効です。代わりに Internet Archive oneを試してください。
または
PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12));
PowerMockを再生モードにするのを忘れましたか?
あなたのリンクごとに...
動作を確認する方法静的メソッドの確認は2つのステップで行われます。最初にPowerMockito.verifyStatic()
を呼び出して動作の検証を開始し、検証する静的メソッドを呼び出します。例えば。
_ PowerMockito.verifyStatic();
Static.firstStaticMethod(param);
_
重要:メソッド検証ごとにverifyStatic()
を呼び出す必要があります。