2011-09-20 384 views
22

我想用Powermock和Mockito来模拟一个无效的静态方法来抛出异常,如下所示。但我遇到了一个问题。除非我使用相同的参数对Adder.add()进行两次调用,否则将不会抛出嘲讽的IOException如何模拟一个无效的静态方法来抛出Powermock异常?

顺便说一句,我已经将@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()); 

回答

23

答案如下。

经过这里的咨询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一个来代替。

+2

这根本不直观。努力得到这个工作。谢谢你的提示。 – Dhiraj

+1

请注意,'Adder.add(anyInt());'不是触发异常的地方,它适用于调用'Adder.add()'。 – sjngm

0

你忘了把PowerMock放在重放模式吗?

How to Mock Static methods.

根据您的链接...

如何验证一个静态方法的行为 验证两个步骤完成。首先调用PowerMockito.verifyStatic()开始验证行为,并调用您要验证的静态方法。例如。

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

重要提示:您需要为每个方法验证调用verifyStatic()

+0

我阅读教程在这里,因为我使用的Mockito。 http://code.google.com/p/powermock/wiki/MockitoUsage13它没有提到我必须使用重放模式。 – Smartmarkey

+0

糟糕。看PowerMockito并阅读PowerMock。 –

+0

根据您的链接编辑 –

1

或者

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