Почему удаление аннотации WebMvcTest из моего теста в приложении SpringBoot приводит к сбою ComponentScan? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть тест, определенный с помощью:

@ComponentScan(basePackages = { ... })
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { AppConfig.class })
@WebMvcTest(secure = false)
public class MyTest extends AbstractJUnit4SpringContextTests  {

     @Autowired SomeClass target;

     @Test public void test() { Assert.assertTrue(target != null); } // MCVE

}

Вот мой класс ContextConfiguration:

@Configuration
public class AppConfig {

    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    ServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory();
    }

}

Этот тест работает нормально, но он тратит много времени на инициализацию MVC из-за@WebMvcTest аннотация.Этот конкретный тест не требует никакой функциональности MVC.Аннотация оказалась в результате проб и ошибок, чтобы аннотация @Autowired работала правильно.Но теперь я хочу удалить его.

Итак ... Я пошел дальше и удалил аннотацию @WebMvcTest.Но тогда тест не пройден, потому что, очевидно, @ComponentScan не имеет никакого эффекта, если только не присутствует @WebMvcTest (я помню, почему я его добавил).

Вот фактическое сообщение об ошибке:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type '...' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Я пытался добавить @SpringBootTest, но это не имело никакого значения.

Если вместо этого я добавляю @EnableAutoConfiguration, я получаю другую ошибку:

java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.

Чтоаннотация я пропустил?

1 Ответ

0 голосов
/ 05 декабря 2018

РЕДАКТИРОВАТЬ:

Почему удаление аннотации WebMvcTest из моего теста в приложении SpringBoot вызывает сбой ComponentScan?

Поскольку вы не аннотировали класс таким образом, чтобы внедрение IoC / Dependency Spring могло работать правильно.

Теперь, когда ответ ясен, вот пара советов, которые вы можете попробовать.Они могут работать, а могут и не работать , в зависимости от того, как ваш проект, зависимости и т. Д. Составлены вместе.

КОНЕЦ РЕДАКТИРОВАНИЯ:

Этот конкретный тест не требует никакого MVCфункциональность.

Следует рассмотреть возможность использования одной из более прямых автоконфигураций аннотаций для ваших тестов, если вам не нужен весь MVC, но требуется автоматическая конфигурация.Например, кажется, что вы тестируете с какой-то системой данных.Возможно, аннотации @ DataJpaTest или @ JdbcTest обеспечат более упорядоченный подход.Это активирует автоматическую настройку (IoC и внедрение зависимостей).

Какие аннотации мне не хватает?

Как написановыше, вы пропустили аннотацию @Configuration

Это противоречит интуитивно, потому что это не класс конфигурации.Но без соответствующей аннотации, которая позволяет внедрять зависимости, это единственный способ заставить это работать.Зачем?

Из документов:

public @interface ComponentScan

  Configures component scanning directives for use with @Configuration classes.

Таким образом, вы можете выбрать:

  1. Использованиедругая аннотация автоконфигурации, как предложено выше
  2. Добавьте аннотацию @Configuration
...