首页 > 解决方案 > Mockito 方法调用存根不起作用 - Mockito.doReturn(false).when(studentServiceImpl).myClass().isValidUser(ArgumentMatchers.anyInt());

问题描述

为 getStudent 方法添加测试用例,这是有内部调用

1-是存储库调用 - 存根此调用工作正常

2- 验证用户调用 - 存根此调用不起作用,显示一些错误并且测试用例失败。

服务等级

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    FakeStudentRepository fakeStudentRepository;
    @Override
    public Optional<Student> getStudent(int id) {
        Optional<Student> student = fakeStudentRepository.getStudent(id);
        boolean isValid = myClass().isValidUser(student.get().getId());
        if(!isValid) {
            return Optional.empty();
        }
        return student;
    }
    public MyTestClass myClass() {
        return new MyTestClass();
    }
 }

我的测试类

public class MyTestClass {
    public boolean isValidUser(int id) {
        return true;
    }
}

测试班

@SpringBootTest
class StudentServiceImplTest {

    @Mock
    FakeStudentRepository fakeStudentRepository;

    @InjectMocks
    StudentServiceImpl studentServiceImpl;

    @BeforeEach
    public void setup() {
        studentServiceImpl = Mockito.spy(StudentServiceImpl.class);
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void getStudent() {
        Optional<Student> student = Optional.of(Student.builder().id(1).firstName("Rahul").lastName("rahul")
                .mobile("XXXXXX").build());

        Mockito.doReturn(student)
                .when(fakeStudentRepository).getStudent(ArgumentMatchers.anyInt());

        Mockito.doReturn(false)
                .when(studentServiceImpl).myClass().isValidUser(ArgumentMatchers.anyInt());

        Optional<Student> resultStudent = studentServiceImpl.getStudent(student.get().getId());
        assertEquals(resultStudent.get().getId(), student.get().getId());
    }
}

错误

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:布尔值不能由 myClass() 返回 myClass() 应该返回 MyTestClass

如果您不确定为什么会出现上述错误,请继续阅读。由于上述语法的性质,可能会出现以下问题,因为: 1. 此异常可能发生在错误编写的多线程测试中。有关并发测试的限制,请参阅 Mockito 常见问题解答。2. 使用 when(spy.foo()).then() 语法对 spy 进行存根。使用 doReturn|Throw() 系列方法来存根间谍更安全。更多关于 Mockito.spy() 方法的 javadocs。

标签: unit-testingjunitmockingmockitojunit5

解决方案


错误消息说:您在嘲笑studentServiceImpl.myClass()并尝试返回true。当您尝试使用第二个 Mockito 表达式时,无法模拟调用链的结尾。

要执行您想要的操作,myClass()首先需要通过返回一个模拟的类实例并对其进行模拟isValidUser来模拟。


推荐阅读