[英]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()
方法來簡單返回true
或false
嗎?
為什么我指定 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.