2014-06-24 77 views
0

我是mockito + powermock的新手。我试图模拟一个拥有私有静态内部类的类。我面临ExceptionInInitializerError。有人可以帮助我正确地初始化课程。如何使用Powermock模拟私人静态内部类

错误:

java.lang.ExceptionInInitializerError 
    at sun.reflect.GeneratedSerializationConstructorAccessor9.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    .................... 
    .................... 
Caused by: java.lang.NullPointerException 
    at com.ibm.retail.xpd.pos.messaging.topics.TopicComponentHelper.<init>(TopicComponentHelper.java:10) 
    at com.ibm.retail.xpd.pos.messaging.topics.NodePath.<init>(NodePath.java:11) 
    at com.ibm.retail.xpd.pos.messaging.service.RetailPlatformService.<init>(RetailPlatformService.java:69) 
    at com.tgcs.scrt.gui.components.PageManager$PageControlService.<init>(PageManager.java:216) 
    at com.tgcs.scrt.gui.components.PageManager.<clinit>(PageManager.java:242) 
    ... 69 more 

类的样子:

public class PageManager{ 
    ......... 
    ......... 
    private static class PageControlService extends PlateFormService{ 
    ......... 
    } 
} 

嘲讽类测试用例:

PowerMockito.mockStatic(PageManager.class); 

回答

3

看起来你错过:

使用@RunWith(PowerMockRunner.class)a在测试用例的类级别上进行注释。 在测试用例的类级别使用@PrepareForTest(ClassThatContainsStaticMethod.class)注释。

来自:

https://github.com/jayway/powermock/wiki/MockStatic

@Marcin - 什么可怕的,居高临下答案。你经常需要模拟静态类。例如,在basho的riak客户端中,响应类是一个静态的内部类(从他们的POV开始,它是有意义的 - 只有客户端应该构造响应)。所以如果你想模拟客户端返回的内容,你必须模拟一个静态的内部类。

对于所有使用“不要模拟X”或者“你测试的代码是错误的”单元测试问题的人来说,真的很累,只是因为他们不知道答案。

+0

+1对'真的很累......'。我们大多数人都知道真正的公司如何处理单元测试,以及我们如何用无法重构的代码创建单元测试,因此看到所有这些'这是一个可怕的想法','你没有得到单元测试的本质'答案是完全可怕和无聊的。 –

+0

我完全不同意你。你可以将你的调用封装在一个你控制的类中的模拟静态方法,然后你可以嘲笑这个类。你不应该嘲笑你通常不拥有的类型。我正在删除我的答案,因为这实际上应该是一个评论。但我确实认为有人试图用错误的工具来解决错误的架构问题 –

相关问题