Unit testing Mockito-thenReturn(true)在模拟对象上仍然返回false
我最近开始读有关莫基托的书。根据我的理解,以下代码行必须返回true,但返回false 测试班Unit testing Mockito-thenReturn(true)在模拟对象上仍然返回false,unit-testing,testing,mockito,Unit Testing,Testing,Mockito,我最近开始读有关莫基托的书。根据我的理解,以下代码行必须返回true,但返回false 测试班 public class PersonServiceImplTest { Car car; @InjectMocks CarServiceImpl carService; @Mock CarDAOImpl carDAO; @Before public void setUp() { MockitoAnnotations.initMoc
public class PersonServiceImplTest {
Car car;
@InjectMocks
CarServiceImpl carService;
@Mock
CarDAOImpl carDAO;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testUpdateCar() {
int carId = 1;
Mockito.when(carDAO.getCarById(any(Integer.class))).thenReturn(new Car());
carService.updateCar(carId);
Mockito.when(carDAO.isLicenseExpired(any(Car.class))).thenReturn(true);
Mockito.verify(carDAO).updateCar(any(Car.class));
Mockito.verify(carDAO, times(1)).isLicenseExpired(any(Car.class));
Mockito.verify(carDAO, times(1)).issueLicense(any(Car.class));
}
}
待测类别
public class CarServiceImpl implements CarService {
@Autowired carDAO carDAO;
@Override
public Response updateCar(int carId) {
Car car =carDAO.getCarById(carId);
try {
carDAO.updateCar(car);
if(carDAO.isLicenseExpired(car)))
carDAO.issueLicense(car);
} catch (Exception e) {
log.error(e.getMessage());
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
return Response.ok(Status.CREATED).build();
}
CarDAOImpl处理数据库,如果需要,也会更新数据库
提前感谢。这两行订购不正确:
carService.updateCar(carId);
Mockito.when(carDAO.isLicenseExpired(Mockito.any(Car.class))).thenReturn(true);
该对中的第一行调用被测类,第二行设置carDAO
在被测类中的行为预期。因此,在调用被测试的类之后设置期望值
以下测试将通过:
@Test
public void testUpdateCar() {
int carId = 1;
// establish expectations of how carDAO should behave inside updateCar()
Mockito.when(carDAO.getCarById(Mockito.any(Integer.class))).thenReturn(new Car());
Mockito.when(carDAO.isLicenseExpired(Mockito.any(Car.class))).thenReturn(true);
// invoke the class-under-test
carService.updateCar(carId);
// verify that CarService used CarDAO correctly
Mockito.verify(carDAO).updateCar(Mockito.any(Car.class));
Mockito.verify(carDAO).isLicenseExpired(Mockito.any(Car.class));
Mockito.verify(carDAO).issueLicense(Mockito.any(Car.class));
}
谢谢你的快速回复。我是否应该在当前执行MockitoAnnotations.initMocks(this)的setUp方法中执行此操作;或者在测试方法本身中?取决于您是否希望在多个测试中重复使用同一对象-然后在设置中,否则,在测试本身中。在代码中执行的位置:
Mockito.when…thenReturn..
?尝试了,没有帮助。因此,(a)在ServiceImpl
中的SomeDaoImpl
实例在运行时不是mock,或者(b)mockedObject.anyMethod(any(Integer.class))
不匹配。您是否验证了serviceinpl
中的SomeDaoImpl
的实例在您的测试调用期间是否是模拟的?你能把anyMethod
的定义发布在SomeDaoImpl
上吗?@glytching我该如何检查(a)?和(b)匹配,因为我能够验证是否调用了任何方法。另外,当我System.out.println(Mockito.when(mockedObject.anyMethod(any(Integer.class)))时,然后返回(true))代码>它确实打印错误。我正在写一些其他方法,它工作了,所以我认为这是顺序。重新排序,它的工作。回到这里找到了同样的答案。:)谢谢你的时间和解释。