java - 使用 Mockito/Powermock 框架模拟最终私有(private)变量

标签 java mockito

我正在尝试模拟一个如下所示的类

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/

相关文章:

python - 基于输入参数模拟python函数

java - Mockito 监视 HSQLDB 连接

objective-c - 我如何使用 OCMock 来验证一个方法从未被调用过?

unit-testing - 如何在 repo 中测试/模拟 Hive (Flutter) 打开框逻辑?

带有 Mockito 1.9.5 的 Java 1.8 给出编译错误

java - 如何使用终端命令在 Red Hat linux 中打开 chrome 浏览器?

java - 使用多线程保存多个 gzip 文件

java - 在不丢失多行功能的情况下为 EditText 设置输入类型?

java - Spring Boot中通过RestTemplate将Json数组发布到Json对象中

java - 为什么JVM不执行代码?