将MockBean移动到单独的配置对象中

时间:2017-08-03 09:50:15

标签: spring unit-testing spring-mvc spring-boot jax-rs

我们正在将Apache CXF资源迁移到Spring MVC。碰巧我们将资源迁移到服务并为所有服务器配备一个大控制器更好。这就是我们以前所拥有的:

@Component
public class MainResource {
    ...
    @Path("/first")
    public FirstResource getFirstResource() {
    ...
    @Path("/second")
    public SecondResource getSecondResource() {

@Component
public class FirstResource {
    @GET
    @Path("/")
    public FirstEntity getFirstEntity() {

@Component
public class SecondResource {
    @GET
    @Path("/")
    public SecondEntity getSecondEntity() {

这就是我们现在所拥有的:

@Controller
public class MainController {
    @Resource
    FirstService firstService;
    @Resource
    SecondService secondService;
    ...
    @GetMapping(/first)
    public FirstEntity getFirst() {
    ...
    @GetMapping(/second)
    public SecondEntity getSecond() {

但是,当测试控制器时出现以下问题:我们希望按服务拆分测试,因此在每次测试中我们都必须为每个服务使用@MockBean(否则无法启动应用程序上下文)。所以这是问题所在:

@RunWith(SpringRunner.class)
@WebMvcTest(MainController.class)
public class FirstWebMvcTest {
    @MockBean
    FirstService firstService;
    @MockBean
    SecondService secondService;

    // testing /first call only. secondService is not used

@RunWith(SpringRunner.class)
@WebMvcTest(MainController.class)
public class SecondWebMvcTest {
    @MockBean
    FirstService firstService;
    @MockBean
    SecondService secondService;

    // testing /second call only. firstService is not used

我们不想复制@MockBean。作为一个临时解决方案,我已将它们全部移动到基类。但我不喜欢扩展基础测试类来获得这个@MockBean定义,在我看来,这似乎是一个肮脏的解决方案。理想情况下,我想将其移至某种配置或其他内容。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

您可以在测试src中创建一个@Configuration类。

@Configuration
@MockBean(FirstService.class)
public class foo{

}

并在需要时导入它,或者如果组件扫描向其添加@Profile,那么当某个配置文件处于活动状态以进行测试和使用模拟bean时,它将处于活动状态。