【发布时间】:2013-10-02 17:40:20
【问题描述】:
我正在尝试模拟如下所示的类
public class MessageContainer {
private final MessageChain[] messages;
MessageContainer(final int numOfMessages, final MessageManagerImpl manager, final Object someOtherStuff) {
messages = new MessageChain[numOfMessages]
// do other stuff
}
public void foo(final int index) {
// do something
messages[index] = getActiveMessage();
}
}
我的测试代码如下:
@Test
public void testFoo() {
MessageContainer messageContainer = Mockito.mock(MessageContainer.class);
Mockito.doCallRealMethod().when(messageContainer).foo(anyIndex);
}
我收到了 NullPointerException,因为 'messages' 为空。我尝试使用@InjectMocks 注入模拟,但是不支持这种情况,因为并非构造函数的每个参数都被声明为成员。
我还尝试使用 WhiteBox 设置“消息”字段
Whitebox.setInternalState(messageContainer, MessageChain[].class, PowerMockito.mock(MessageChain[].class));
但我得到一个编译错误,因为 setInternalState 只支持 (Object, Object, Object) 而不是 Object[]。
有没有办法模拟一个私有的 final 字段?
提前谢谢你们。
【问题讨论】:
-
MessageChain 的构造函数无法编译...您是否遗漏了 varargs 参数?一种或另一种方式,它有一个错字。一旦改正,我想我可以帮助你。
-
你是在模拟
MessageContainer,还是在尝试用模拟的MessageChain构造一个真实的MessageContainer?您的问题不清楚。 -
@TJamesBoone:是的,我忽略了 MessageContainer 的其他参数。我只是做了一个例子来展示我想要做什么。
-
@TomG:我正在尝试模拟 MessageContainer。我刚刚更新了我的问题,希望现在更清楚。谢谢你:)
-
来自
foo的NullPointerException应该是不可能的。您没有调用foo的真正实现,因为您有一个MessageContainer的模拟实例。请展示整个测试类。