我试图模仿下面的类
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,因为'消息'一片空白。我尝试使用@InjectMocks注入模拟,但不支持这种情况,因为并非构造函数的每个参数都声明为成员。
我还试图设置“消息”'使用WhiteBox
的字段 Whitebox.setInternalState(messageContainer, MessageChain[].class, PowerMockito.mock(MessageChain[].class));
但是我收到了编译错误,因为setInternalState只支持(Object,Object,Object)而不支持Object []。
有没有办法模拟私人最终字段?
提前谢谢你们。
答案 0 :(得分:0)
根据你的编辑和评论,我会说嘲笑这个类并且验证方法被调用就足够了。
如果是第三方代码,则应该在其方法签名上依赖 only ,该方法签名包含类的公共API。否则,您将测试与您无法控制的事物紧密耦合。当他们决定使用Collection
而不是数组时,你会怎么做?
简单地写一下:
MessageContainer container = mock(MessageContainer.class);
//Your code here...
verify(container).foo(obj);