【发布时间】:2017-11-17 08:31:31
【问题描述】:
我最近开始阅读有关 Mockito 的信息。根据我的理解,以下代码行必须返回 true,但它返回 false。
测试类
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 处理数据库,如果需要,也会更新它。
提前致谢。
【问题讨论】:
-
感谢您的快速回复。我应该在我目前做 MockitoAnnotations.initMocks(this); 的 setUp 方法中做吗?还是在测试方法本身?
-
取决于您是否要在多个测试中重复使用同一个对象 - 然后在设置中,否则,在测试本身中。您在代码中执行的位置:
Mockito.when...thenReturn..? -
试过了,没用。
-
因此,要么 (a)
ServiceImpl中的SomeDaoImpl实例在运行时 不是 模拟,要么 (b)mockedObject.anyMethod(any(Integer.class))不匹配。在您的测试调用期间,您是否验证ServiceImpl中的SomeDaoImpl实例是否为模拟?你能把anyMethod的定义贴在SomeDaoImpl上吗? -
@glytching 我如何检查 (a) ?并且 (b) 是匹配的,因为我能够验证是否调用了 anyMethod。另外,当我
System.out.println(Mockito.when(mockedObject.anyMethod(any(Integer.class))).thenReturn(true));它确实打印错误。
标签: unit-testing testing mockito