簡體   English   中英

Mockito:模擬並注入一個模擬的類

[英]Mockito: Mock and inject a mocked class

我目前面臨以下測試用例:我想從akka模擬抽象的ActorRef類:

@RunWith(MockitoJUnitRunner.class)
public class ConstraintBuilderTest {
    @Mock
    ClassANeededByClassB a;

    @InjectMock
    ClassB b;


    @Before
    public void setUp(){
        Mockito.when(a.equals(a)).thenReturn(true);
    }


    //tests go here
}

我知道mockito頁面說它無法模擬等於。 那么有關於如何模仿的想法嗎?

ClassB上的equals方法使用ClassANeededByClassB來檢查它的相等性。

我能想到的就是在模擬的類中注入一個b。 如何最好地進行?

請注意,這些類來自一個我無法更改的框架,因此我無法更改其代碼以添加setter或類似的東西。

b是模擬,所以你不需要注入任何東西。 畢竟它沒有執行任何真正的方法(除非你通過調用thenCallRealMethod明確地這樣做),所以不需要注入任何ClassANeededByClassB實現。

如果ClassB是被測試的類或間諜,那么你需要使用@InjectMocks注釋,它將任何匹配的@InjectMocks注入ClassB

@RunWith(MockitoJUnitRunner.class)
public class ConstraintBuilderTest {

    @Mock
    ClassANeededByClassB a;

    @InjectMocks
    ClassB b;

    // ...
}

如你所說,Mockito不支持嘲笑equals 可能有一些解決方法,但我不知道。 所以這里只是對它的一些想法:

  • Mockito的方法是,如果你不能用Mockito嘲笑它,它可能設計得很糟糕,應該重構。 我知道這不是你的代碼,這實際上導致了下一點:
  • “不要測試框架”。 您可能根本不需要測試這個部分 - 框架創建者應該負責測試它。 如果它是一個開源項目,您可以嘗試提供補丁。
  • Mockito有一些自我限制,所以它可能不適合這項工作。 還有其他更強大的模擬框架,並且能夠做到這一點。

暫無
暫無

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

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