簡體   English   中英

被測類中的模擬類

[英]Mock class in class under test

我如何在我正在測試的班級中使用 Mockito 其他班級進行模擬?

例如:

我的類

class MyClass {
    public boolean performAnything() {
        AnythingPerformerClass clazz = new AnythingPerformerClass();
        return clazz.doSomething();        
    }
}

任何表演者類.java

class AnythingPerformerClass {
    public boolean doSomething() {
        //very very complex logic
        return result;
    }
}

並測試:

@Test
public void testPerformAnything() throws Exception {
    MyClass clazz = new MyClass();
    Assert.assertTrue(clazz.performAnything());
}

我可以欺騙AnythingPerformerClass以從AnythingPerformerClass排除不必要的邏輯嗎? 我可以覆蓋doSomething()方法來簡單返回truefalse嗎?

為什么我指定 Mockito,因為我需要它來使用 Robolectric 進行 Android 測試。

您可以重構MyClass以便它使用依賴注入 您可以將類的實例傳遞給MyClass的構造函數,而不是讓它創建一個AnythingPerformerClass實例,如下所示:

class MyClass {

   private final AnythingPerformerClass clazz;

   MyClass(AnythingPerformerClass clazz) {
      this.clazz = clazz;
   }

   public boolean performAnything() {         
     return clazz.doSomething();        
   }
}

然后您可以在單元測試中傳入模擬實現

@Test
public void testPerformAnything() throws Exception {
   AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class);
   MyClass clazz = new MyClass(mockedPerformer);
   ...
}

或者,如果您的AnythingPerformerClass包含狀態,那么您可以將AnythingPerformerClassBuilder傳遞給構造函數。

由於它是目前(包括聲明和實例化AnythingPerformerClass的方法中,這是不可能的嘲笑AnythingPerformerClass只使用的Mockito。

如果可能,將AnythingPerformerClass的聲明和實例化都移動到類級別:聲明一個AnythingPerformerClass類型的實例變量並由構造函數實例化它。

這樣一來,你可以更輕松地將一個模擬AnythingPerformerClass測試過程中,並指定其行為。 例如:

when(anythingPerformerClassMock.doSomething()).thenReturn(true);

或測試錯誤處理:

when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException());

您可以在 Mockito 中設置要返回的內容。

when(mock.method()).thenReturn(someValue)

暫無
暫無

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

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