У меня есть тест, определенный с помощью:
@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.
Чтоаннотация я пропустил?