代码之家  ›  专栏  ›  技术社区  ›  Álvaro Nieto

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

  •  2
  • Álvaro Nieto  · 技术社区  · 8 年前

    我不熟悉MyBatis和单元测试。

    我有一个 CourseService 类,该类目前只有调用并返回MyBatis映射器的等效方法的方法( 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) ? 可以模拟映射器并使用该映射器构造服务,并对 getById 返回id作为参数传递的课程?

    when(courseMapper.getCourseById(anyInt()))
        .thenAnswer(this::returnCourseWithSameIdThatInTheArgument); 
    ...
    
    private Course CourseWithSameIdThatInTheArgument(InvocationOnMock i) {
        return new Course((int)i.getArguments()[0],true,1,"","",1);
    }
    

    提前谢谢你。

    2 回复  |  直到 8 年前
        1
  •  0
  •   Rishikesh Dhokare    8 年前

    理想情况下,您应该嘲笑 CourseMapper 并验证是否 courseMapper.getById(id) 使用预期 id

    像这样的

    莫基托。验证(courseMapper,Mockito.times(1))。getById(id)

    这样做的原因是——CourseMapper是一个不同的类,您可以假设它已经经过了很好的测试。你在这里所做的是打击 CourseMapper.getById() 这是不需要的。

        2
  •  0
  •   Maciej Kowalski    8 年前

    一般而言,有关核查的规则:

    从模拟中预期某些行为,而不是从存根中。

    由于存根也可能记录行为,因此很容易对其进行一些验证。

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

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

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

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