当前位置: 首页 > 知识库问答 >
问题:

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

洪鸿博
2023-03-14

我不熟悉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);
...

我应该单元测试课程ervice.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个答案

后学
2023-03-14

一般来说,关于核查的规则:

期待莫克斯的某些行为,而不是存根的行为。

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

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

查询不会改变世界,因此可以调用任意次数,包括无次调用。

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

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

湛鸿
2023-03-14
匿名用户

理想情况下,您应该模拟CourseMapper,并验证是否为CourseMapper。getById(id)用预期的id调用一次

像这样的东西

Mockito.verify(课程映射器,Mockito.times(1)). getById(id)

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

 类似资料:
  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 问题内容: 如何在Angular中对过滤器进行单元测试? 问题答案: 注入然后用 所以要测试这个模板的等效性

  • 以下是设置: 我需要测试公共方法,以检查是否筛选了invalidObjects。如您所见,它将传递给私有的方法。该方法过滤掉无效的对象,并将有效的对象发送给web服务方法。该web服务方法不返回任何内容。因此,我不知道是否只有有效的对象被发送到web服务方法。你建议我怎么做才能检验这个案子?我正在使用Mockito框架来模拟对象。

  • 我在go中对gRPC服务进行单元测试时遇到困难。 我看了一下测试gRPC服务,但它对我不起作用,不确定我做错了什么。 Add方法的gRPC服务实现: Add方法的单元测试: 项目目录结构 抛出一个错误,称为。 我对非常陌生,找不到解决方法。

  • 我试图用Spock为套接字客户端和服务器编写单元测试。我应该如何在单元测试中设置服务器/客户机对,以便它能够工作? 通过在测试之外手动运行服务器类,我成功地测试了我的客户端类,但是当我试图在测试类内部初始化它时,所有的测试似乎要么挂起,要么得到一个拒绝的连接。 目前,我使用的只是Oracle的EchoServer和EchoClient代码的稍微修改版本。 客户端类: 服务器启动方法: