使用Mockito / Powermock框架模拟最终的私有变量

时间:2013-09-26 16:23:10

标签: 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);
}

我收到了NullPointerException,因为'消息'一片空白。我尝试使用@InjectMocks注入模拟,但不支持这种情况,因为并非构造函数的每个参数都声明为成员。

我还试图设置“消息”'使用WhiteBox

的字段
    Whitebox.setInternalState(messageContainer, MessageChain[].class, PowerMockito.mock(MessageChain[].class));

但是我收到了编译错误,因为setInternalState只支持(Object,Object,Object)而不支持Object []。

有没有办法模拟私人最终字段?

提前谢谢你们。

1 个答案:

答案 0 :(得分:0)

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

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

简单地写一下:

MessageContainer container = mock(MessageContainer.class);
//Your code here...
verify(container).foo(obj);