代码之家  ›  专栏  ›  技术社区  ›  David

有没有办法在WebMvcTest中包含spring组件

  •  1
  • David  · 技术社区  · 6 年前

    给定的生产代码类:

    @RestController
    @RequiredArgsConstructor
    public class MyController {
    
        private final MyValidator validator;
    
        // annotations relating to request mapping excluded for brevity 
        public void test(@Valid @RequestBody final MyParams params) {
            // do stuff
        }
    
        @InitBinder
        @SuppressWarnings("unused")
        protected void initBinder(final WebDataBinder binder) {
            binder.setValidator(validator);
        }
    }
    

    @Component
    @RequiredArgsConstructor
    public class MyValidator implements Validator {
    
        ...
    
        @Override
        public void validate(final Object target, final Errors errors) {
            // custom validation
        }
    }
    

    @RunWith(SpringRunner.class)
    @WebMvcTest(MyController.class)
    public class MyControllerTest {
        // tests
    }
    

    我遇到错误:

    NoSuchBeanDefinitionException:没有'MyValidator'类型的限定bean可用:应至少有1个bean符合自动连线候选。依赖项批注:{}

    我认为这个错误是公平的。我将测试注释为WebMvcTest,我相信它排除了 @Component

    因此,我的问题是:如何在web测试的测试上下文中显式地包含像验证器这样的组件?

    version "10.0.2" 2018-07-17 ,弹簧靴 1.5.16.RELEASE .

    1 回复  |  直到 6 年前
        1
  •  2
  •   derekpark    6 年前

    有两种方法可以测试web层

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MyControllerTest {
      @Autowired
      private MyController myController;
    }
    

    @SpringBootTest注释告诉Spring Boot去寻找 主配置类(一个带有@springbootsapplication for 实例),并使用它启动一个Spring应用程序上下文。

    一个很好的特性 弹簧试验 支持是应用程序 一个或多个具有相同配置的测试用例 只需要启动一次应用程序。你可以控制 使用@DirtiesContext注释的缓存。

    @RunWith(SpringRunner.class)
    @WebMvcTest(MyController.class)
    public class MyControllerTest {
    
      @MockBean
      private MyValidator validator;
    
    }
    

    但是这个验证器是假的,所以您必须定制它进行测试。

    有关详细信息,请参阅此链接 https://spring.io/guides/gs/testing-web/

        2
  •  1
  •   Alexander Pranko    5 年前

    我不能推荐它作为标准实践,但是如果您确实需要Web MVC测试中的依赖项实例(例如在遗留代码中),可以使用 @SpyBean 注解。

    @MockBean

    @RunWith(SpringRunner.class)
    @WebMvcTest(MyController.class)
    public class MyControllerTest {
    
        @SpyBean
        private MyValidator validator
    }