关于类模拟的理解确认:控制器与服务层单元测试场景
你的理解完全正确!
没错,你这两种测试场景下的做法都是单元测试里隔离外部依赖的标准操作,完全不会触发真实的数据库调用:
控制器测试场景:你通过
createMock(BookService.class)生成了BookService的模拟实例,再用ReflectionTestUtils.setField把这个模拟对象注入到HomeController中。这时候测试控制器的方法时,所有对bookService的调用都会指向这个模拟对象,不会执行真实BookService里的业务逻辑,自然也就不会触发后续的数据库操作。服务类测试场景:同样的道理,你模拟了BookRepository并注入到BookService后,BookService里所有依赖bookRepository的方法调用,都会被这个模拟对象接管。模拟的Repository不会去连接真实数据库执行SQL,所有的交互都是在内存中模拟的,所以完全不会产生数据库调用。
这种做法的核心就是把待测试类和它的外部依赖隔离开,让测试只聚焦在当前类的逻辑本身,避免外部依赖(比如数据库、第三方服务)的不稳定因素干扰测试结果,这也是单元测试的核心原则之一。
内容的提问来源于stack exchange,提问作者valen ezu
相关产品推荐
相关产品推荐

