根據標題,我在測驗服務方法時遇到了一個問題。我想這應該是一些配置問題,或者更多的是對 mockito 的錯誤使用。
有CustomerDataService的代碼
@Service
public class CustomerDataService {
@Autowired
CustomerDataRepository customerDataRepository;
...
@Transactional
public void methodTotest(boolean consent, Long dialogId) {
CustomerData customer = customerDataRepository.findCustomerByDialogId(dialogId);
if (!consent) {
customerDataRepository.deleteById(customer.getCustomerId());
}else{
customer.setConsentGiven(true);
customerDataRepository.save(customer);
}
}
在測驗 CustomerDataServiceTest @SpringBootTest 類 CustomerDataServiceTest {
@Autowired
CustomerDataService customerDataService;
@MockBean
CustomerDataRepository customerDataRepository;
@Test
void removeCustomerDataWhenConsentIsNotGiven() {
CustomerData customerDataTest = customerData;
//when
customerDataService.giveConsent(false,22L);
//then
verify(customerDataRepository,times(1)).save(customerDataTest);
}
錯誤是
java.lang.NullPointerException: Cannot invoke "com.mypackage.CustomerData.getCustomerId()" because "customer" is null
這是 myMethod 的第二行 在此先感謝
uj5u.com熱心網友回復:
解決方案很簡單。您模擬了一個類customerDataRepository,但沒有指示模擬在呼叫相應方法時要做什么。Mockito 模擬然后默認doing nothing通過方法呼叫重新打開,如果有回傳值return null。由于您回傳的 customerData 為 null,因此您在呼叫此物件時會獲得 NPE。在您的情況下,這是您通過呼叫getCustomerId().
要解決此問題,只需指示您的模擬
@Test
void removeCustomerDataWhenConsentIsNotGiven() {
CustomerData customerDataTest = customerData;
//when
Mockito.when(customerDataRepository.findCustomerByDialogId(Mockito.any())).thenReturn(new CustomerData()); // <-- Add this line
customerDataService.giveConsent(false,22L);
//then
verify(customerDataRepository,times(1)).save(customerDataTest);
}
您顯然可以用您之前創建的物件替換Mockito.any()或Mockito.anyInt()替換。我想你應該已經明白了 ;)42new CustomerData()
uj5u.com熱心網友回復:
假設您在將其發布到 Stackoverflow 之前剛剛更正了方法名稱,并且您在測驗中呼叫的方法:giveConsent實際上與 CustomerDataService 的方法相同methodTotest。
在呼叫之前customerDataService.giveConsent(false,22L);,您需要將存盤庫配置為回傳一些測驗(不是 null!或模擬)customerData 物體:
when(customerDataRepository.findCustomerByDialogId(22L)).thenReturn(customerDataTest);
customerDataService.giveConsent(false,22L);
注意:由于您是false作為第一個變數傳遞的,因此您將進入此代碼分支
if (!consent) {
customerDataRepository.deleteById(customer.getCustomerId());
}
在測驗中,您期望save()呼叫方法,因此測驗將失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471007.html
