Java @MockBean和@Autowired在一个测试类中使用相同的服务

Java @MockBean和@Autowired在一个测试类中使用相同的服务,java,spring,junit,mockito,spring-boot-test,Java,Spring,Junit,Mockito,Spring Boot Test,是否可能在同一测试类中有相同服务的@MockBean和@Autowired 换句话说,我只想为一个测试提供@MockBean服务,而对于同一类的其他测试,我需要它作为@Autowired 这取决于@MockBean和@Autowired之间的差异 @Autowired 仅在SpringContext中查找该类型的bean。这意味着,如果需要“自动连接”该bean,则需要创建该bean @MockBean 按照您对名称的期望,它创建服务的“mock”,并将其作为bean注入 那么这个 classm

是否可能在同一测试类中有相同服务的
@MockBean
@Autowired


换句话说,我只想为一个测试提供
@MockBean
服务,而对于同一类的其他测试,我需要它作为
@Autowired

这取决于
@MockBean
@Autowired
之间的差异

@Autowired
仅在
SpringContext
中查找该类型的bean。这意味着,如果需要“自动连接”该bean,则需要创建该bean

@MockBean
按照您对名称的期望,它创建服务的“mock”,并将其作为bean注入

那么这个

classmytest{
@蚕豆
我的服务我的服务;
}
相当于这个

@Import(MyTest.Config.class)
类MyTest{
@自动连线
我的服务我的服务;
@测试配置
静态类配置{
@豆子
MyService MyService(){
返回Mockito.mock(MyService.class);
}
}
}

因此,如果您需要在其他测试中使用不同类型的
MyService
bean,则需要在
@TestConfiguration
注释类中创建bean

@Import(MyTest.Config.class)
类MyTest{
@自动连线
我的服务我的服务;
@测试配置
静态类配置{
@豆子
MyService MyService(){
返回新的MyServiceImpl();
}
}
}
或者,在用
@配置注释的类中

@Import(MyConfig.class)
类MyTest{
@自动连线
我的服务我的服务;
}
@配置
公共类MyConfig{
@豆子
MyService MyService(){
返回新的MyServiceImpl();
}
}

我怀疑这里的邪恶根源是场注入

Olvier Gierke(现在的Drotbohm)写了一篇关于为什么磁场注入是邪恶的文章

如果您可以切换到构造函数注入,那么您可以在测试中模拟服务,并将模拟传递给要测试的类


我只想把这个答案留在这里,作为对其他可能有机会使用构造函数注入的人的建议。

这些是不同的测试,属于不同的测试类。