亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

嚕嚕噠 2023-06-08 13:50:44
我是單元測試中模擬事物的新手,我已經開始嘗試使用 Mockito。使用 Mockito 可以進行以下操作嗎?我正在嘗試為分層 Web 服務應用程序編寫單元測試。此時我正在測試Service層,它調用DAO層從數據庫中獲取數據。我需要模擬數據庫結果,這樣我就不會在每次運行單元測試時都對數據庫進行真正的更新調用。我正在考慮通過模擬我的服務層調用的 DAO 對象來做到這一點,但我需要在不更改源代碼的情況下做到這一點。如果我目前正在對服務層進行單元測試,我怎樣才能讓它使用模擬的 DAO 層?我的單元測試看起來像這樣:@Testpublic 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 進行依賴管理。
查看完整描述

3 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

您需要在測試設置中使用像 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 類似乎是一個靜態類,因此您可能需要閱讀如何盡可能地模擬它。否則你可能想讓它成為一個單身人士。


查看完整回答
反對 回復 2023-06-08
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

例如,如果您在服務層上進行測試,您可以這樣做。


@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

}


查看完整回答
反對 回復 2023-06-08
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

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



查看完整回答
反對 回復 2023-06-08
  • 3 回答
  • 0 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號