簡體   English   中英

如何在服務層單元測試中模擬數據庫結果?

[英]How to mock database results in service layer unit test?

我是在單元測試中模擬事物的新手,我已經開始試驗 Mockito。 使用 Mockito 可以進行以下操作嗎?

我正在嘗試為分層 Web 服務應用程序編寫單元測試。 此時我正在測試Service層,它調用DAO層從數據庫中獲取數據。 我需要模擬數據庫結果,以便每次運行單元測試時都不會對數據庫進行真正的更新調用。

我想通過模擬我的服務層調用的 DAO 對象來做到這一點,但我需要在不更改源代碼的情況下做到這一點。 如果我目前正在對服務層進行單元測試,我怎樣才能讓它使用模擬的 DAO 層?

我的單元測試如下所示:

@Test
public void testUpdate() {
RequestObject request = new RequestObject();
request.setEntityId(1234);
request.setLob('testLOB');
ResponseObject response = service.updateMember(request);
}

我的服務方式:

public ResponseObject updateMember(RequestObject request) {
ResponseObject result = DAO.updateMember(request);
}

在這種情況下,是否可以在不模擬服務的情況下模擬 DAO? 編輯:我使用 Maven 進行依賴管理。

您需要在測試設置中使用像 Mokito 這樣的 Mocker。 就像是:

public class YouTestClass {

    @MockBean
    DAO mockedDAO;
...
@Test
public void testUpdate() {
        Mockito.when(mockedDAO.updateMember(Mockito.isA(RequestObject.class)).thenReturn(new ResponseObject());
RequestObject request = new RequestObject();
request.setEntityId(1234);
request.setLob('testLOB');
ResponseObject response = service.updateMember(request);
}

您將需要調整.thenReturn(new ResponseObject()); 到 ResponseObject 您實際想要接收的測試。 此外,您的 DAO 類似乎是一個靜態類,因此如果可能,您可能需要閱讀如何模擬它。 否則你可能想讓它成為一個單身人士。

例如,如果您在服務層上進行測試,則可以執行以下操作。

@Mock
private DAO dao;

@Test
public void testUpdate() {

   RequestObject request = new RequestObject();
   request.setEntityId(1234);
   request.setLob('testLOB');

   ResponseObject result = //the response that you want

   when(dao.updateMember(eq(request))).thenReturn(result);

   ResponseObject response = service.updateMember(request);

   // ASSERTIONS HERE
}

我所做的基本上是:當我通過 Service 調用調用 DAO 時,例如 '''when(AccountManagerImpl.saveAccount(testAccount)).thenReturn(mockedAccount)'''。 挑戰在於該方法何時返回 void 即只是將一些數據轉儲到表中。 這意味着您必須間接確認方法調用。 就我而言,我使用“verify(mockedAccount, times(1)).saveAccount)”。 這只能保證該方法至少被調用一次。 當然還有更深的層次。 如果您想確認數據是否已寫入實際表,那​​么您自然需要一個更強大的測試工具,即設置測試數據庫等。結果集例如 when(mockPreparedStmnt.execute()).thenReturn(Boolean.TRUE) 這當然會產生大量的假設,這些假設可能會反過來咬你。 您基本上是在說 - 讓我們假設數據已正確保存。 但是,如果這個假設本身就是 SUT 呢? 我只是在代碼審查期間提出它 - 這里是測試覆蓋率矩陣可以為您節省很多時間的地方。

暫無
暫無

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

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