unit-testing - 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。
解决方案
错误消息说:您在嘲笑studentServiceImpl.myClass()
并尝试返回true。当您尝试使用第二个 Mockito 表达式时,无法模拟调用链的结尾。
要执行您想要的操作,myClass()
首先需要通过返回一个模拟的类实例并对其进行模拟isValidUser
来模拟。
推荐阅读
- sql - 如果零日不生成行/数据,如何获得每人每天的平均活动?
- mysql - 以下sql代码的语法错误是什么?
- java - 如何解决 NumberFormatException:空字符串,同时在 android 中工作而不使用任何 try and catch 异常处理程序?
- javascript - 如何将过渡效果添加到 JavaScript 切换菜单?
- python - 如何在单个 PyQt GUI 实例中多处理多个绘图
- swift - '通话中的额外参数'
- python - 我不知道如何解决这个错误,python3 语法错误'def'
- google-sheets - Google表格查询:在单元格中按日期显示数据
- qt - QT如何将样式表应用于列
- ios - Swift - 如何摆脱 UISearchController 中的这种深色背景?