簡體   English   中英

Mockito模擬返回值並驗證它

[英]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))

  • 模擬是對真實系統的模仿,通常用於單元測試。 模擬通常在像MockitoEasyMock這樣的框架中創建,但不需要。 模擬是一種“測試雙重”形式 - 用於代替實際系統的代碼的通用術語,用於測試目的 - 而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.

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