【问题标题】:Avoid proliferation of @MockBeans in Spring Boot @WebMvcTest test避免在 Spring Boot @WebMvcTest 测试中扩散 @MockBeans
【发布时间】:2018-03-03 13:12:06
【问题描述】:

我有一个简单的控制器,例如

@Controller
public class FooController
{
    @Autowired
    private BarService barService;

    @RequestMapping(value = "/foo", method = RequestMethod.GET)
    public String displayFoo()
    {
        return "foo";
    }
}

当我想做@WebMvcTest 时,我必须创建大量@MockBeans 来防止NoSuchBeanDefinitionException

@RunWith(SpringRunner.class)
@WebMvcTest
@Import(WebSecurityConfig.class)
public class FooControllerTest
{
    @MockBean ...
    @MockBean ...
    @MockBean ...
    ...
    ...
}

这是否意味着BarService 以某种方式创建了一个依赖链? (它有一些依赖关系,但一些@MockBeans 似乎完全不相关)。

问题是,我为不同控制器添加的每个@WebMvcTest 也需要相同的@MockBeans。

我是否应该使用 @TestConfiguration 之类的注解来指定 DRY 主体的所有 @MockBeans?

【问题讨论】:

  • 如果 FooController 只依赖于 BarService 如您的代码所示,您应该只需要一个用于 BarService 的模拟 bean。模拟 bean 没有任何依赖关系:它是一个模拟。

标签: spring-mvc spring-boot spring-boot-test


【解决方案1】:

我又看了一遍,发现你可以将控制器名称传递给@WebMvcTest,例如@WebMvcTest(FooController.class).

指定要测试的控制器。如果所有 {@code @Controller} bean 应该被添加到应用程序上下文中。

【讨论】:

    【解决方案2】:

    正如Hal8k所说,如果你不指定像@WebMvcTest(YourController.class)这样的控制器,它会尝试加载所有@Controller组件。而@Import(WebSecurityConfig.class) 也尝试在WebSecurityConfig.class 中注入组件。

    参考:https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4

    【讨论】:

      【解决方案3】:

      当 bean 扫描配置错误或过多时,可能会发生这种情况。

      就我而言,尽管在@WebMvcTest(FooController.class) 中指定了要测试的控制器,但我仍然收到错误消息。

      我最终意识到这是由于我的应用程序的@ComponentScan 被不必要地弄乱了。我的 Application.java 是这样的:

      @SpringBootApplication
      @ComponentScan({"fr.nevechris.projectname","fr.nevechris.projectname.otherpackage"})
      public class Application {
      
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
      }
      

      我完全删除了@ComponentScan,问题就解决了。

      如果您的@ComponentScan 良好或未指定,请尝试在您的项目中搜索完成配置的其他位置(例如@Configuration 标签)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        相关资源
        最近更新 更多