是否可能在同一个测试类中拥有同一个服务的@MockBean和@Autowired?换句话说,我希望只为一个测试提供@MockBean服务,而对于同一类的其他测试,我需要它作为@Autowired。
@MockBean
@Autowired
uubf1zoe1#
这取决于@MockBean和@Autowired之间的差异。
只在SpringContext中查找该类型的bean。这意味着如果需要“自动连接”bean,则需要创建该bean
SpringContext
完全按照您对名称的期望,它创建服务的“模拟”,并将其作为bean注入。所以这
class MyTest { @MockBean MyService myService; }
相当于
@Import(MyTest.Config.class) class MyTest { @Autowired MyService myService; @TestConfiguration static class Config { @Bean MyService myService() { return Mockito.mock(MyService.class); } } }
因此,如果您需要在其他测试中使用MyService类型的不同bean,则需要在@TestConfiguration注解类中创建bean
MyService
@TestConfiguration
@Import(MyTest.Config.class) class MyTest { @Autowired MyService myService; @TestConfiguration static class Config { @Bean MyService myService() { return new MyServiceImpl(); } } }
或者,在用@Configuration标注的类中
@Configuration
@Import(MyConfig.class) class MyTest { @Autowired MyService myService; } @Configuration public class MyConfig { @Bean MyService myService() { return new MyServiceImpl(); } }
dced5bon2#
最好的解决方案是将@MockBean更改为@SpyBean。在该方法中,您将能够执行以下操作:Kotlin
@SpyBean lateinit var serviceMock: Service @Test fun smallTest() `when`(serviceMock.doSomething()) .thenReturn(false) // your test logic }
eaf3rand3#
我怀疑这里邪恶的源头是力场注入。Olvier Gierke(现在的Drotbohm)写了一篇关于为什么场注入是邪恶的blog post。如果可以切换到构造函数注入,则可以在测试中模拟服务,并将模拟传递给要测试的类。我只是想把这个答案留在这里,作为对其他可能有机会使用构造函数注入的人的建议。
3条答案
按热度按时间uubf1zoe1#
这取决于
@MockBean
和@Autowired
之间的差异。@Autowired
只在
SpringContext
中查找该类型的bean。这意味着如果需要“自动连接”bean,则需要创建该bean@MockBean
(四个月)完全按照您对名称的期望,它创建服务的“模拟”,并将其作为bean注入。
所以这
相当于
因此,如果您需要在其他测试中使用
MyService
类型的不同bean,则需要在@TestConfiguration
注解类中创建bean或者,在用
@Configuration
标注的类中dced5bon2#
最好的解决方案是将
@MockBean
更改为@SpyBean。在该方法中,您将能够执行以下操作:Kotlin
eaf3rand3#
我怀疑这里邪恶的源头是力场注入。
Olvier Gierke(现在的Drotbohm)写了一篇关于为什么场注入是邪恶的blog post。
如果可以切换到构造函数注入,则可以在测试中模拟服务,并将模拟传递给要测试的类。
我只是想把这个答案留在这里,作为对其他可能有机会使用构造函数注入的人的建议。