我正在嘗試為以下方法創建單元測驗:
public CommandDTO update(final MenuRequest request) {
Menu menu = menuRepository.findByUuid(request.getUuid());
MenuConverter.convert(request, menu); // map fields
Menu saved = menuRepository.save(menu);
return CommandDTO.builder().uuid(saved.getUuid()).build();
}
我想捕獲saved引數,因為它不是從使用以下單元測驗的方法回傳的:
@RunWith(MockitoJUnitRunner.class)
public class MenuServiceImplTest {
@InjectMocks
private MenuServiceImpl menuService;
@Captor
private ArgumentCaptor<Menu> menuCaptor;
// mocks (code omitted for brevity)
@Test
public void test_Update() {
// ...
CommandDTO result = menuService.update(request);
verify(menuRepository).save(menuCaptor.capture());
final Menu captured = menuCaptor.getValue();
}
}
但是,里面的引數menuRepository.save()是未保存的引數,但我需要捕獲saved引數。那么,我該怎么做呢?我應該使用@Spy而不是ArgumentCaptor嗎?
uj5u.com熱心網友回復:
如果那是一個單元測驗,那么我假設你已經模擬了MenuRepository.
要正確模擬MenuRepository,您需要定義menuRepository.findByUuid(request.getUuid())and的行為menuRepository.save(menu)。
定義menuRepository.findByUuid(request.getUuid())后,您需要創建一個Menu實體。您需要做的就是檢查其中的欄位menu是否正確更新。
uj5u.com熱心網友回復:
讓我們嘗試分解MenuServiceImpl'update方法的功能:
public CommandDTO update(final MenuRequest request) {
Menu menu = menuRepository.findByUuid(request.getUuid());
MenuConverter.convert(request, menu); // map fields
Menu saved = menuRepository.save(menu);
return CommandDTO.builder()
.uuid(saved.getUuid())
.build();
}
這是此方法的作用:
- 從存盤庫中獲取現有
Menu的,通過查找uuid - 轉換它,即更新它
request - 使用將其持久化回存盤庫
save CommandDTO從保存的 uuid創建一個。
現在,當我們為一個單元撰寫UnitTest時,這意味著我們只測驗該單元的作業。這里MenuServiceImpl不負責確保值是否正確映射或更新的值是否正確保存,唯一MenuServiceImpl執行的作業是以特定順序呼叫這些依賴項,這就是我們需要在這里測驗的全部內容。MenuServiceImpl因此,這是對'方法的正確測驗update:
@Test
void test_Update() {
MenuRequest request = new MenuRequest("1234");
Menu existingMockMenu = mock(Menu.class);
when(menuRepository.findByUuid("1234")).thenReturn(existingMockMenu);
Menu savedMockMenu = mock(Menu.class);
when(menuRepository.save(existingMockMenu)).thenReturn(savedMockMenu);
menuServiceImpl.update(request);
verify(menuRepository).save(existingMockMenu);
}
如果您想測驗是否MenuRepository保存Menu正確,則必須為 撰寫一個新測驗MenuRepository,如果這實際上是一個與資料庫互動的存盤庫,那么撰寫 DB 集成測驗將很有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411800.html
標籤:
