1

我正在尝试模拟如下所示的课程

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[]。

有没有可能模拟私有最终字段的方法?

提前谢谢你们。

4

1 回答 1

0

根据您的编辑和评论,我会说模拟这个类并验证方法被调用就足够了。

如果是第三方代码,你应该依赖它的方法签名,它包含类的公共 API。否则,您将测试与您无法控制的事物紧密耦合。Collection当他们决定使用 a而不是数组时,你会怎么做?

简单地写:

MessageContainer container = mock(MessageContainer.class);
//Your code here...
verify(container).foo(obj);
于 2013-09-26T20:50:12.527 回答