这应该经常发生:
RestController -> SomeClass -> SomeOtherClass -> YetAnotherClass
等等......
在我的具体案例中,有一个责任链被注入休息控制器。每个课程都注入了上述链中的前一课程。
我已经使用spring boot实现了这一点,并且我试图测试REST资源。我想模拟" YetAnotherClass" ,这样当我用MockMvc发送请求时,我可以验证模拟对象中发生了什么。
问题是如果我使用 @MockBean 来模拟 YetAnotherClass ,那么我必须将它注入 SomeOtherClass 。我试图用 @TestConfiguration 注入它,但是当通过MockMvc发送请求时,Mock对象注入似乎不会以这种方式工作,并且模拟对象嵌套在链的内部深处如上。 (原始的bean注入的不是模拟的)
我知道JMockit会嘲弄一个类的每个实例,所以它可以解决我的问题。但Spring引导默认为Mockito,我更喜欢避免不一致。
我如何实施这样的测试场景?
答案 0 :(得分:1)
在设置Mockito
文字灯具时,我使用Spring JUnit
的注释配置设置遇到了很多麻烦。
我发现我喜欢用这样的外部集成模拟bean的方式,基本上有一个单独的MockObjectsConfig
类,我想要使用标准的Spring Context Configuration,我想要的模拟对象,然后将它导入我真正的测试配置:
@Configuration
public class MockObjectsConfig {
@Bean
public YetAnotherClass yetAnotherClass() {
Mockito.mock(YetAnotherClass.class); // and add any thenReturns, answers, etc. here
}
... More mock beans...
}
然后将其包含在您的测试中:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { MyRealConfigClass.class, MockObjectsConfig.class)
public class MyJunitTest {
@Autowired
private RestController restController;
}
如果您需要防止那里的冲突,您还可以使用@Profile
注释您的模拟bean并使用@ActiveProfiles
进行测试。
这样你的模拟YetAnotherClass
就会像你所有的其他bean一样注入你的上下文 - 不依赖于,混合和摆弄Mockito和其他库注释。