Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/testing/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Mockito-thenReturn(true)在模拟对象上仍然返回false_Unit Testing_Testing_Mockito - Fatal编程技术网

Unit testing Mockito-thenReturn(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

我最近开始读有关莫基托的书。根据我的理解,以下代码行必须返回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处理数据库,如果需要,也会更新数据库


提前感谢。

这两行订购不正确:

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))它确实打印错误。我正在写一些其他方法,它工作了,所以我认为这是顺序。重新排序,它的工作。回到这里找到了同样的答案。:)谢谢你的时间和解释。