当前位置: 首页 > 知识库问答 >
问题:

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

阎宝
2023-03-14

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

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

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

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = OrderController.class, excludeFilters = {@Filter(classes = Configuration.class), @Filter(type = FilterType.REGEX, pattern = "com\\.foo\\..*")})
@TestPropertySource(properties = { "spring.cloud.config.server.bootstrap:false" })
public class OrderControllerTest {

    @MockBean
    private OrderService orderService;


    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test() throws Exception {
        mockMvc.perform(get("/internal/order/123"));
        // Further code to verify the response
    }

}

控制器

@Slf4j
@Validated
@RestController
@RequestMapping("/internal")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @GetMapping(value = "/order/{orderId}", produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<RegularContributionOrder> retrieveRegularContributionOrder(@NotNull @PathVariable("orderId") String orderId)
            throws OrderNotFoundException {

        RegularContributionOrder order = orderService.retrieve(orderId);

        return new ResponseEntity<RegularContributionOrder>(order, HttpStatus.OK);
    }
}

我想从上下文加载中排除的配置类

java prettyprint-override">@Slf4j
@Configuration
@EnableAspectJAutoProxy
@ImportResource({ "classpath:spring/service-config-one.xml", "classpath:spring/service-config-two.xml" })
public class OrderServiceConfig {

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:resourcebundles/error-messages.properties");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        return mapper;
    }
}

Spring启动主类:

@EnableJms
@EnableAspectJAutoProxy
@ComponentScan(basePackages = { "com.foo.services", "com.bar" })
@SpringBootApplication(exclude = { SomeConfiguration.class})
public class BootApplication extends SpringBootServletInitializer {

    @Override
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
        return application.sources(BootApplication .class);
    }

    public static void main(final String[] args) {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        SpringApplication.run(BootApplication.class, args);
    }
}

共有2个答案

罗昊空
2023-03-14

当您的测试类位于测试文件夹中并使用“测试”配置文件运行时,您的真实配置类将被排除在外。这是我如何配置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);
}
尉迟正平
2023-03-14

您对@ComponentScan的使用已禁用@WebMvcTest用于限制通过扫描找到的组件类型的过滤器

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

您还应该将EnableJms和EnableAspectJAutoProxy移动到一个单独的配置类,这样在使用WebMvcTest时它们就不会被启用。或者,您可以完全删除它们,因为它们被Spring Boot的自动配置覆盖。

 类似资料:
  • 我最近把SpringFox换成了SpringDoc。 以前,我可以排除用于Swagger UI的路径,如下所示: 在上述情况下,将为path3和path5显示Swagger UI。 在使用SpringDoc时使用GroupedOpenAPI,我只看到了一种显式设置应该允许哪些路径的方法,例如。 我希望有一种更通用的方法,通过这种方法,我可以指定哪些路径不允许,因此,如果我添加更多的路径,它们将在默

  • 我有一个简单的Spring Boot应用程序,其中有一个jpa存储库对象,我希望它在类中自动生成,如下所示。 下面是类 我有以下例外。

  • 我们的软件使用api(filenet p8),需要配置log4j。我们使用logBack和Spring Boot。我注意到,要在Spring Boot中使用log4j,我们必须排除logBack。这是不可能的。有没有办法在Spring Boot中并行运行log4j和logBack?谢啦

  • 有没有办法绕过授权?

  • controller.java UserServiceImpl.java 我得到了这个错误 应用程序启动失败 描述: 我使用的SpringBoot版本:2.1.0.发行版

  • 我正在尝试使用Jackson Library1.5创建一个Json对象,但是也会得到具有空值的对象。 如何消除空值? 我试图找到替代办法,但没有找到。大多数可用的解决方案都与Jackson2.2一起使用。有人能帮我解决这个1.5吗? 我看过这里和这里。