如何对基本上1对1调用MyBatis Mapper接口的服务方法进行单元测试

时间:2018-01-12 10:10:18

标签: java unit-testing junit mockito mybatis

我是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);
}

提前谢谢。

2 个答案:

答案 0 :(得分:0)

理想情况下,您应该模拟CourseMapper并验证courseMapper.getById(id)是否会被调用一次id

像这样的东西

  

Mockito.verify(courseMapper,Mockito.times(1))。getById(id)

这样做的原因是 - CourseMapper是一个不同的类,你可以假设它已经过很好的测试。你在这里做的是扼杀CourseMapper.getById()不需要的行为。

答案 1 :(得分:0)

一般而言,有关验证的规则:

期待来自Mocks的某些行为,绝不会来自Stubs。

由于Stubs也可能记录行为,因此很容易对他们进行一些验证。

您需要记住,它们的唯一目的是为稍后的处理或命令调用提供数据(这是被测试类的实际功能)。

查询不会改变世界,因此可以多次调用它们,包括无。但

另一方面,命令调用(在Mocks上调用)可能会产生副作用,并会改变目标对象之外的世界。

您正在尝试测试违反该规则的存根。