在使用Spring Boot @WebMvcTest进行测试时,如何从我的上下文中排除其他@Controller

我有多个控制器,我的理解是通过在@WebMvcTest中指定一个控制器,其他控制器不会被加载到上下文中。 来自文档

controllers – 指定要测试的控制器。 如果应将所有@Controller bean添加到应用程序上下文中,则可以留空。

我的第一个控制器

@Controller public class MyController { @Autowired private MyService myService; private final Logger logger = Logger.getLogger(this.getClass()); @RequestMapping(value = "/", method = RequestMethod.GET) public @ResponseBody ResponseEntity index() { try { myService.get(); return new ResponseEntity(HttpStatus.OK); } catch (Exception e) { logger.error(e); e.printStackTrace(); } return new ResponseEntity("REQUEST FAILED", HttpStatus.INTERNAL_SERVER_ERROR); } } 

我的其他控制器

 @Controller public class MyOtherController { @Autowired private MyOtherService myOtherService; etc... } 

我的控制器测试

 @RunWith(SpringRunner.class) @WebMvcTest(controllers = { MyController.class }, secure = false) @ActiveProfiles({ "test" }) public class MyControllerTest { @Autowired private MockMvc mockMvc; @MockBean MyService myService; @Test public void testBaseReq() throws Exception { Testing dummyData = new Testing(); dummyData.setData("testing"); when(myService.get(anyInt())).thenReturn(dummyData); this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk()); } } 

但是当我运行此测试时,它无法在加载上下文时尝试从MyOtherContoller加载bean MyOtherService。

 2017-09-28 11:50:11.687 DEBUG 16552 --- [ main] osbfsDefaultListableBeanFactory : Creating shared instance of singleton bean 'myOtherController' 2017-09-28 11:50:11.687 DEBUG 16552 --- [ main] osbfsDefaultListableBeanFactory : Creating instance of bean 'myOtherController' 2017-09-28 11:50:11.687 DEBUG 16552 --- [ main] osbfannotation.InjectionMetadata : Registered injected element on class [my.package.other.myOtherController]: AutowiredFieldElement for private my.package.other.myOtherService my.package.other.myOtherController.myOtherService 2017-09-28 11:50:11.687 DEBUG 16552 --- [ main] osbfsDefaultListableBeanFactory : Eagerly caching bean 'myOtherController' to allow for resolving potential circular references 2017-09-28 11:50:11.687 DEBUG 16552 --- [ main] osbfannotation.InjectionMetadata : Processing injected element of bean 'myOtherController': AutowiredFieldElement for private my.package.other.myOtherService my.package.other.myOtherController.myOtherService 2017-09-28 11:50:11.688 DEBUG 16552 --- [ main] osbfsDefaultListableBeanFactory : Creating shared instance of singleton bean 'myOtherService' 2017-09-28 11:50:11.688 DEBUG 16552 --- [ main] osbfsDefaultListableBeanFactory : Creating instance of bean 'myOtherService' 2017-09-28 11:50:11.689 DEBUG 16552 --- [ main] osbfannotation.InjectionMetadata : Registered injected element on class [my.package.other.myOtherService]: AutowiredFieldElement for private my.package.other.myOtherMapper my.package.other.myOtherService.myOtherMapper 2017-09-28 11:50:11.689 DEBUG 16552 --- [ main] osbfannotation.InjectionMetadata : Registered injected element on class [my.package.other.myOtherService]: AutowiredFieldElement for private ie.aib.services.coredemo.FinancialsRegionService my.package.other.myOtherService.financialsRegionService 2017-09-28 11:50:11.689 DEBUG 16552 --- [ main] osbfsDefaultListableBeanFactory : Eagerly caching bean 'myOtherService' to allow for resolving potential circular references 2017-09-28 11:50:11.689 DEBUG 16552 --- [ main] osbfannotation.InjectionMetadata : Processing injected element of bean 'myOtherService': AutowiredFieldElement for private my.package.other.myOtherMapper my.package.other.myOtherService.myOtherMapper 2017-09-28 11:50:11.690 WARN 16552 --- [ main] oswcsGenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myOtherController': Unsatisfied dependency expressed through field 'myOtherService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myOtherService': Unsatisfied dependency expressed through field 'myOtherMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'my.package.other.myOtherMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

我认为指定要在WebMvcTest注释中测试的控制器会将其限制为唯一加载该控制器。 但它试图加载其他控制器,因为它的bean没有被嘲笑它失败了。

我错过了什么或者我的理解不正确? 我想我应该只为被测控制器模拟bean。 我还尝试使用excludeFilter来专门排除其他Controller的包但不改变错误。

请确保您的测试选择Application.class ,不包含@ComponentScan注释。 例如,这是您的包结构

 abc-project +--pom.xml +--src +-- main +-- com +-- abc +-- Application.java +-- controller +-- MyController.java +-- test +-- com +-- abc +-- Application.java +-- controller +-- MyControllerTest.java 

测试中Application.java应该与此示例类似,

 @SpringBootApplication public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } 

my.package.other.myOtherMapper(可能是Mybatis Mapper文件)缺失或未明确初始化。

据我所知,myOtherService实现类具有未正确映射的Mapper文件。

您可能必须先映射它们。 如果可能,您可以发布Mapper xml内容。