[英]Mockito Mocking a return value and verify it
我有這個類,並希望創建一個模擬返回並驗證返回值“50”:
QAService.java:
@Path("/QAService")
public class QAService {
@GET()
//@Path("/")
@Produces("text/plain")
public String getServiceInfo() {
return "50";
}
我對定義模擬的理解是我可以創建一個實現類的假對象和模擬函數,但是我可以測試接口。
我仍然在創建這個測試來測試沒有接口的模擬。 我該如何驗證呢?:
QAServiceTest.java:
public class QAServiceTest {
@Test
public void getserviceTest () {
QAService qasmock = mock(QAService.class);
when(qasmock.getServiceInfo()).thenReturn("50");
String expected = "50";
assertEquals(expected, qasmock.getServiceInfo());
}
}
讓我們直接得到幾個定義,首先:
單元測試是您編寫的一小段代碼,以確保您開發的系統運行正常。 單元測試通常在像JUnit
這樣的框架中創建,但不需要。 例如,單元測試將assertEquals(5, calculator.add(2, 3))
。
模擬是對真實系統的模仿,通常用於單元測試。 模擬通常在像Mockito
或EasyMock
這樣的框架中創建,但不需要。 模擬是一種“測試雙重”形式 - 用於代替實際系統的代碼的通用術語,用於測試目的 - 而Martin Fowler在一篇名為“Mocks Are not Stubs”的文章中更准確地定義了它們。
在編寫單元測試時,您正在嘗試測試單個單元,通常稱為被測 系統或簡稱SUT 。 每個測試可能會有一個不同的系統正在測試中,重點是您在測試中測試的代碼是您真實的實際代碼 ,而不是任何類型的模擬或虛假實現。
在復雜的應用程序中,您的類可能需要與可能編寫或測試的其他類協作,這些類通常稱為依賴項 。 任何給定的類或系統可能都有自己的依賴項,並且可能是其他系統的依賴項。 模擬框架有助於模擬這些依賴項,而不是模擬被測系統。
對於您的示例,QAService是您正在編寫的主類(被測系統),QAServiceTest是該系統的單元測試。 不需要嘲笑。
假設QAService依賴於另一個尚未編寫的類,稱為“StorageService”。 在編寫QAService測試之前,您不一定要等待StorageService工作,因此不使用真正的StorageService而是使用模擬 。 同樣,在名為QAServiceTest的單元測試中 ,您使用真正的 QAService並模擬其依賴 StorageService。
即使您沒有編寫StorageService,您也可能對QAService如何使用該類有所期待。 也許你知道當你調用storageService.store(qaRecord)
,它應該返回一個像101
這樣的數字ID。 即使沒有代碼工作,您也可以創建一個Mockito mockStorageService
,並按照以下方式進行准備:
when(mockStorageService.store(expectedQARecord)).thenReturn(101);
現在讓我們說在測試結束時,您要確保您正在測試的QAService方法絕對會調用storageService.delete(101)
。 Mockito mockStorageService
會像這樣檢查:
verify(mockStorageService).delete(101);
通常不必驗證使用when
語句,因為測試不太可能成功,除非被測系統正確調用mock以獲得返回值(此處為101)。
現在讓我們說你已經編寫了另一個名為QAApplication的代碼塊,你正在一個名為QAApplicationTest的單元測試中測試,它依賴於QAService。 您可能沒有完成或測試QAService,並且使用真正的QAService需要StorageService,因此您在單元測試中使用模擬 QAService和真正的 QAApplication,稱為QAApplicationTest。
因此,總而言之,模擬在單元測試中工作以模擬被測系統的依賴性 。 在您的情況下,QAServiceTest不需要模擬QAService,但可能用於模擬QAService的依賴項。 如果你確實需要一個模擬QAService,那么在測試另一個QAService本身是依賴的類時你需要它。
Junit只會運行用@Test
注釋的方法,所以添加它
@Test
public void getserviceTest () {
QAService qasmock = mock(QAService.class);
when(qasmock.getServiceInfo()).thenReturn("50");
String expected = "50";
assertEquals(expected, qasmock.getServiceInfo());
}
此外,您應該verify()
您的模擬期望實際發生了。
verify(qasmock, times(1)).getServiceInfo();
請注意,您似乎想要測試QAService
,但實際上您並沒有這樣做。 你只是在測試一個模擬器。 那不是一回事。
自己創建QAService
對象並使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.