Unit testing Mockito方法调用存根不工作-Mockito.doReturn(false).when(studentserviceinpl.myClass().isValidUser(ArgumentMatchers.anyInt());

Unit testing Mockito方法调用存根不工作-Mockito.doReturn(false).when(studentserviceinpl.myClass().isValidUser(ArgumentMatchers.anyInt());,unit-testing,junit,mocking,mockito,junit5,Unit Testing,Junit,Mocking,Mockito,Junit5,正在为getStudent方法添加测试用例,这有内部调用 1-存储库调用-stubing此调用工作正常吗 2-验证用户调用-终止此调用不起作用,显示一些错误和测试用例失败 服务等级 测试班 错误 org.mockito.exceptions.misusing.ErrorTypeOfReturnValue:布尔值 无法由myClass返回myClass应返回MyTestClass 如果您不确定为什么会出现上述错误,请继续阅读。由于 出现上述语法问题的原因可能是: 1.此异常可能发生在错误编写的多线

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

1-存储库调用-stubing此调用工作正常吗

2-验证用户调用-终止此调用不起作用,显示一些错误和测试用例失败

服务等级

测试班

错误

org.mockito.exceptions.misusing.ErrorTypeOfReturnValue:布尔值 无法由myClass返回myClass应返回MyTestClass

如果您不确定为什么会出现上述错误,请继续阅读。由于 出现上述语法问题的原因可能是: 1.此异常可能发生在错误编写的多线程测试中。请参考Mockito关于并发限制的常见问题解答 测试。 2.间谍将使用whenspy.foo.then语法进行存根。更安全的做法是让间谍- -使用doReturn |抛出方法系列。有关Mockito.spy方法的更多信息,请参阅javadocs


错误消息显示:您正在模拟studentServiceImpl.myClass并尝试返回true。在尝试使用第二个Mockito表达式时,不可能模拟调用链的结尾

要执行您想要的操作,首先需要通过返回一个mock类实例并在该实例上模拟isValidUser来模拟myClass

@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());
    }
}