我需要測試一種方法,該方法會創建Car
對象並使用CarDao
保存它在數據庫中。另一種方法獲取Car
對象,但如果CarDao
是模擬,則car.getUser()
返回null
而不是正確的User
對象。這是我的代碼。爲什麼Mockito.when(...)。doReturn(...)無法正常工作,如果它從Mockito.doAnswer調用(...)
Mockito.doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
lastCarId++;
Car car = (Car) invocationOnMock.getArguments()[0];
// here car.getUser() returns correct user object
car.setId(lastCarId);
Mockito.when(carDao.getById(car.getId())).thenReturn(car);
return null;
}
}).when(carDao).persist(Mockito.any());
爲什麼carDao.getById(carId).getUser()
返回null?我需要做什麼才能獲得正確的user
字段值的對象?
更新
carDao
用法:
Car car = carService.create("car name1", "color", "year", user); // in this method called carDao.persist(...);
car.setColor("color2");
carService.findById(car.getId());
// this method calls carDao.getById(carId)
// and comapres with authenticated user ID.
// But carDao.getById(carId) returns car with user == null
下面是CarService
類,其中代碼引發NullPointerException異常的一部分。
// carService.findById(...) method
public Car findById(Car id) {
Car car = carDao.getById(id);
User carUser = car.getUser(); // returns null
User currentUser = accountService.getAuthenticatedUser(); // returns correct user object
if (!carUser.getId().equals(currentUser.getId())) { // throws NullPointerException
return null;
}
return car;
}
謝謝。
你的'用戶'對象是否設置在你從'invocationOnMock.getArguments()[0];'檢索到的'car'對象中?如果沒有,需要檢查它爲什麼爲空 – Draken
@Draken,是'用戶'對象設置在'car'對象中我從'invocationOnMock.getArguments()[0];' –
中檢索到'你在什麼時候檢查' carDao.getById(carId).getUser()'屬性?我們可以看到你的部分在哪裏被稱爲? – Draken