我是MyBatis和单元测试的新手。
我有一个CourseService
类(目前)只有调用和返回MyBatis Mapper(CourseMapper
)的等效方法的方法。
CourseService类。
@Autowired
private CourseMapper courseMapper;
public Course getById(int id) {
return courseMapper.getById(id);
}
...
CourseMapper界面。
@Select("select from courses where id = #{id}")
public Course getById(int id);
...
我应该对courseService.getById(id)
进行单元测试吗?适合模拟Mapper并使用该映射器构造服务并对getById
进行模拟调用,返回一个id作为参数传递的Course?
when(courseMapper.getCourseById(anyInt()))
.thenAnswer(this::returnCourseWithSameIdThatInTheArgument);
...
private Course CourseWithSameIdThatInTheArgument(InvocationOnMock i) {
return new Course((int)i.getArguments()[0],true,1,"","",1);
}
提前谢谢。
答案 0 :(得分:0)
理想情况下,您应该模拟CourseMapper
并验证courseMapper.getById(id)
是否会被调用一次id
像这样的东西
Mockito.verify(courseMapper,Mockito.times(1))。getById(id)
这样做的原因是 - CourseMapper是一个不同的类,你可以假设它已经过很好的测试。你在这里做的是扼杀CourseMapper.getById()
不需要的行为。
答案 1 :(得分:0)
一般而言,有关验证的规则:
期待来自Mocks的某些行为,绝不会来自Stubs。
由于Stubs也可能记录行为,因此很容易对他们进行一些验证。
您需要记住,它们的唯一目的是为稍后的处理或命令调用提供数据(这是被测试类的实际功能)。
查询不会改变世界,因此可以多次调用它们,包括无。但
另一方面,命令调用(在Mocks上调用)可能会产生副作用,并会改变目标对象之外的世界。
您正在尝试测试违反该规则的存根。