Java 在spring boot中使用@WebMvcTest时,如何排除@Configuration类?

Java 在spring boot中使用@WebMvcTest时,如何排除@Configuration类?,java,spring-boot,junit4,Java,Spring Boot,Junit4,我正在为rest控制器编写junits。我只希望加载与控制器相关的最小上下文,我认为这就是@WebMvcTest加载上下文的方式。但是junit正在加载完整的Spring上下文,它失败了,因为无法创建一些bean 我已经搜索并阅读了许多关于stackoverflow的问题,没有一个解决方案能够排除特定的配置。在为控制器编写junits时,如何加载最小上下文?或者有没有办法排除某些配置类?我使用的是SpringBoot2.2.2.RELEASE、Java8和JUnit4 Junit(我曾尝试排除加

我正在为rest控制器编写junits。我只希望加载与控制器相关的最小上下文,我认为这就是
@WebMvcTest
加载上下文的方式。但是junit正在加载完整的Spring上下文,它失败了,因为无法创建一些bean

我已经搜索并阅读了许多关于stackoverflow的问题,没有一个解决方案能够排除特定的配置。在为控制器编写junits时,如何加载最小上下文?或者有没有办法排除某些配置类?我使用的是SpringBoot2.2.2.RELEASE、Java8和JUnit4

Junit(我曾尝试排除加载一些bean和配置,但不起作用):

@RunWith(SpringRunner.class)
@WebMvcTest(controllers=OrderController.class,excludeFilters={@Filter(classes=Configuration.class),@Filter(type=FilterType.REGEX,pattern=“com\\\.foo\\\…*”)
@TestPropertySource(属性={“spring.cloud.config.server.bootstrap:false”})
公共类OrderControllerTest{
@蚕豆
私人订单服务;
@自动连线
私有MockMvc-MockMvc;
@试验
public void test()引发异常{
mockMvc.perform(get(“/internal/order/123”);
//进一步验证响应的代码
}
}
控制器

@Slf4j
@验证
@RestController
@请求映射(“/internal”)
公共类OrderController{
@自动连线
私人订单服务;
@GetMapping(value=“/order/{orderId}”,products={MediaType.APPLICATION\u JSON\u value})
公共响应权限检索规则配置顺序(@NotNull@PathVariable(“orderId”)字符串orderId)
抛出OrderNotFoundException{
RegularContributionOrder order=orderService.retrieve(orderId);
返回新的响应状态(订单,HttpStatus.OK);
}
}
要从上下文加载中排除的配置类

@Slf4j
@配置
@促性腺激素
@ImportResource({“classpath:spring/service config one.xml”,“classpath:spring/service config two.xml”})
公共类OrderServiceConfig{
@豆子
public MessageSource MessageSource(){
ReloadableResourceBundleMessageSource=新的ReloadableResourceBundleMessageSource();
messageSource.setBasename(“classpath:resourcebundles/error messages.properties”);
messageSource.setDefaultEncoding(“UTF-8”);
返回消息源;
}
@豆子
公共对象映射器对象映射器(){
ObjectMapper mapper=新的ObjectMapper();
返回映射器;
}
}
Spring boot主类:

@EnableJms
@促性腺激素
@ComponentScan(basePackages={“com.foo.services”,“com.bar”})
@SpringBootApplication(排除={SomeConfiguration.class})
公共类BootApplication扩展了SpringBootServletInitializer{
@凌驾
受保护的最终SpringApplicationBuilder配置(最终SpringApplicationBuilder应用程序){
返回application.sources(bootplication.class);
}
公共静态void main(最终字符串[]args){
TimeZone.setDefault(TimeZone.getTimeZone(“UTC”));
run(BootApplication.class,args);
}
}

当您的测试类位于测试文件夹中并使用“测试”配置文件运行时,您的真实配置类将被排除。下面是一个如何配置spring引导测试的示例

@RunWith(SpringRunner.class)
@SpringBootTest(classes = IntegrationApplication.class,
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class MyControllerTest {
=================================

@SpringBootApplication
public class IntegrationApplication {

public static void main(String[] args) {
    SpringApplication.run(IntegrationApplication.class, args);
}

使用
@ComponentScan
已禁用
@WebMvcTest
使用的筛选器,以限制通过扫描找到的组件类型

您应该从主应用程序类中删除
@ComponentScan
,并使用
@SpringBootApplication
上的
basePackages
属性


您还应该将
@EnableJms
@enableSpectjautoproxy
移动到一个单独的
@Configuration
类,以便在使用
@WebMvcTest
时不启用它们。或者,您可以完全删除它们,因为Spring Boot的自动配置涵盖了它们。

您可以共享带有
@SpringBootApplication
注释的主类吗?@AndyWilkinson感谢您的评论。问题已更新。
IntegrationApplication
是什么?弹簧靴主类?是的。该类仅用于测试。还有另一个spring boot main是“real”。您还可以分析您的配置类,如“@profile(“!test”)”以将其从测试上下文中排除。谢谢您的回答@安迪·威尔金森的回答对我来说很有用,真是不可思议。它应该是@SpringBootApplication中的参数“basePackages”,而不是“backPackages”。可能是一个小错误,谢谢,普罗米修斯。我已经修正了打字错误。为什么它能用?