web-dev-qa-db-ja.com

Powermockでvoid静的メソッドをモックして例外をスローする方法は?

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());
28
Smartmarkey

回答は以下の通りです

ここを参照した後 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を試してください。

27
Smartmarkey

または

PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12));
4
kk1957

PowerMockを再生モードにするのを忘れましたか?

静的メソッドをモックする方法

あなたのリンクごとに...

動作を確認する方法静的メソッドの確認は2つのステップで行われます。最初にPowerMockito.verifyStatic()を呼び出して動作の検証を開始し、検証する静的メソッドを呼び出します。例えば。

_ PowerMockito.verifyStatic();
 Static.firstStaticMethod(param);
_

重要:メソッド検証ごとにverifyStatic()を呼び出す必要があります。

0
John B