簡體   English   中英

使用Mockito / Powermock框架模擬最終私有變量

[英]Mock final private variable using Mockito/Powermock framework

我正在嘗試模擬一個如下所示的類

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'為null。 我試圖使用@InjectMocks注入模擬,但是不支持這種情況,因為並非構造函數的每個參數都聲明為成員。

我還嘗試通過使用WhiteBox設置“郵件”字段

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

但由於setInternalState僅支持(對象,對象,對象)而不支持對象[],因此出現了編譯錯誤。

有沒有可能模擬私人最終領域的方法?

預先謝謝你們。

根據您的編輯和評論,我想模擬此類並驗證該方法已被調用就足夠了。

如果它是第三方代碼,則應依靠其方法簽名,該方法簽名包含該類的公共API。 否則,您會將測試與無法控制的內容緊密結合在一起。 當他們決定使用Collection而不是數組時,您會怎么做?

只需寫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM