Spring Boot Test - 模拟处理责任链中的处理程序Bean

时间:2018-05-13 20:27:42

标签: spring spring-boot mockito

这应该经常发生:

RestController -> SomeClass -> SomeOtherClass -> YetAnotherClass等等......

在我的具体案例中,有一个责任链被注入休息控制器。每个课程都注入了上述链中的前一课程。

我已经使用spring boot实现了这一点,并且我试图测试REST资源。我想模拟" YetAnotherClass" ,这样当我用MockMvc发送请求时,我可以验证模拟对象中发生了什么。

问题是如果我使用 @MockBean 来模拟 YetAnotherClass ,那么我必须将它注入 SomeOtherClass 。我试图用 @TestConfiguration 注入它,但是当通过MockMvc发送请求时,Mock对象注入似乎不会以这种方式工作,并且模拟对象嵌套在链的内部深处如上。 (原始的bean注入的不是模拟的)

我知道JMockit会嘲弄一个类的每个实例,所以它可以解决我的问题。但Spring引导默认为Mockito,我更喜欢避免不一致。

我如何实施这样的测试场景?

1 个答案:

答案 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和其他库注释。