如何使用Powermock模拟void静态方法抛出exception?

我试图使用Powermock和Mockito来模拟一个void静态方法来抛出exception,如下所示。 但我遇到了一个问题。 除非我使用相同的参数对Adder.add()进行两次调用,否则不会抛出模拟的IOException

顺便说@RunWith(PowerMockRunner.class) ,我已经将@RunWith(PowerMockRunner.class)@PrepareForTest(Adder.class)到unit testing类中。

 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 1。

要么

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

您是否忘记将PowerMock置于重放模式?

如何模拟静态方法。

根据你的链接……

如何validation行为静态方法的validation分两步完成。 首先调用PowerMockito.verifyStatic()以开始validation行为并调用要validation的静态方法。 例如

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

重要提示:您需要按方法validation调用verifyStatic()