JavaSpring通过构造函数注入初始化的mock
我有一个单例类(所以是私有构造函数),它需要在初始化期间使用Spring数据存储库。我有一个作为构造函数参数注入。大致:
@Controller
public class MyClass {
@Autowired
private MyClass(MyRepository repo) {
repo.findAll();
}
}
我想对我的类进行单元测试,所以我需要用模拟值初始化一个模拟存储库,然后在初始化类之前将其传递到我的类中。我如何在JUnit测试中编写Mockito mock来实现这一点
# 1 楼答案
对于
@Controller
实现来说,“单元测试”没有什么价值。如果使用@WebMvcTest
,则可以使用@MockBean
:# 2 楼答案
单元测试应该是独立的。这意味着,我们没有使用数据库中的真实数据,甚至没有从测试文件中调用任何服务
假设您使用的是JUnit5,并且控制器中有
findAllStudents()
。你的测试文件大致如下所以我们模拟控制器中使用的所有服务,然后注入控制器本身。然后在测试方法中,我们模拟
repo.findAll()
以返回expectedNames
,因此如果控制器找到该函数,它将返回模拟所说的返回值调用函数后,我们必须确保结果符合预期
# 3 楼答案
你不需要春天;这是构造函数注入的一个优点。只需使用
MyRepository mockRepo = mock(MyRepository.class)
和new MyClass(mockRepo)
(顺便说一句,你的构造函数应该是公共的。你似乎犯了一个常见的错误,混淆了“singleton”的不同含义;在DI的情况下,它只是意味着容器只生成一个实例并共享它。最后,如果你只有一个构造函数,你不需要^{)