我正在尝试模拟一个如下所示的类
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);
}
由于“messages”为空,我收到了 NullPointerException。我尝试使用 @InjectMocks 注入(inject)模拟,但是不支持这种情况,因为并非构造函数的每个参数都被声明为成员。
我还尝试使用 WhiteBox 设置“消息”字段
Whitebox.setInternalState(messageContainer, MessageChain[].class, PowerMockito.mock(MessageChain[].class));
但是我遇到了编译错误,因为 setInternalState 仅支持 (Object, Object, Object) 而不是 Object[]。
有没有可能的方法来模拟私有(private)最终字段?
先谢谢你们了。
最佳答案
根据您的编辑和评论,我想说模拟此类并验证该方法是否被调用就足够了。
如果是第三方代码,您应该仅依赖其方法签名,其中包含类的公共(public) API。否则,您的测试与您无法控制的事物耦合得太紧密。当他们决定使用 Collection
而不是数组时,您会做什么?
简单地写:
MessageContainer container = mock(MessageContainer.class);
//Your code here...
verify(container).foo(obj);
关于java - 使用 Mockito/Powermock 框架模拟最终私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033571/