Как исключить класс @Configuration при использовании @WebMvcTest с spring-boot? - PullRequest
1 голос
/ 17 февраля 2020

Я пишу джунты для контроллера покоя. Я хочу, чтобы загружался только минимальный контекст, связанный с контроллером, и я думаю, что именно так @WebMvcTest загружает контекст. Но junit загружает полный контекст Spring и не работает, так как некоторые компоненты не могут быть созданы.

Я искал и прочитал много вопросов о стековом потоке, и ни одно из решений не работало для исключения указанных c конфигурации. Как я могу загрузить минимальный контекст при написании юнитов для контроллеров? Или есть ли способ исключить некоторые классы конфигурации? Я использую Spring-boot 2.2.2.RELEASE, Java 8 и Junit 4.

Junit (где я пытался исключить загрузку некоторых компонентов и конфигураций, но это не работает):

@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);
    }
}

Класс конфигурации, который я хочу исключить из контекстной загрузки

@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;
    }
}

Основной класс пружинной загрузки:

@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 ]

2 голосов
/ 17 февраля 2020

При использовании @ComponentScan отключены фильтры, используемые @WebMvcTest для ограничения типов компонентов, обнаруживаемых при сканировании.

Вы должны удалить @ComponentScan из основного класса приложения и вместо этого используйте атрибут backPackages для @SpringBootApplication.

Вам также следует переместить @EnableJms и @EnableAspectJAutoProxy в отдельный класс @Configuration, чтобы они не были включены при использовании @WebMvcTest. Кроме того, вы можете удалить их полностью, так как они покрыты автоматической настройкой Spring Boot.

1 голос
/ 17 февраля 2020

Когда ваши тестовые классы расположены в тестовой папке и запускаются с «тестовым» профилем, тогда ваш реальный класс конфигурации будет исключен. Вот пример того, как я настраиваю весенний тест загрузки.

@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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...