Junit5 Spring 引导自动装配 ComponentScan 不工作
Junit5 Spring Boot Autowire ComponentScan Not Working
我的问题:如果我的测试引用 @SpringBootTest
中列出的 class 中的 @Bean
声明,则自动装配有效。如果它引用 @SpringBootTest
中列出的 class 自动 @ComponentScan
的 class,则自动装配失败。在测试之外,我的应用程序启动时没有自动装配或组件扫描问题,我可以确认我想在测试中加载的服务在非测试中运行良好。我很沮丧。我坏了,还是 Spring Boot 2 上的 Junit5 功能?
我的测试:
@ExtendWith(SpringExtension.class)
@SpringBootTest (classes=MyConfig.class)
public class MyTest {
// fails to autowire
@Autowired
private MyService _mySvc ;
// succeeds!
@Autowired @Qualifier ( "wtf" )
private String _wtf ;
我的配置:
@EnableWebMvc
@SpringBootApplication ( scanBasePackages = "my.packaging" )
@Configuration
public class MyConfig {
@Bean
public String wtf ( ) { return "W T F???" ; }
// No @Bean for MyService because component scan is nicer in the non-test world
我想是因为你这样注释:
@SpringBootTest (classes=MyConfig.class)
Spring 只会在 MyConfig.class
中查找合适的 bean,无法为 MyService
找到合适的 bean,但是,我认为 Spring 会扫描所有当应用程序正常 运行 时,为 bean 打包。这就是它在非测试中运行良好的原因。
我遇到了同样的问题,尽管测试已经开始,但自动装配无法正常工作,问题是我仍在使用旧的 junit4 @Test 注释。
确保您的测试方法使用来自 juni5 包 org.junit.jupiter.api.Test 的 @Test 注释。
正如@Tudro 所说,org.junit.jupiter.api.Test
适用于 Junit 5。org.junit.Test
适用于 Junit 4。
在下面使用这个:
@ExtendedWith(SpringExtension.class)
@SpringBootTest
也许你可以添加 @ContextConfiguration(classes = ApplicationConfiguration.class)
看起来像这样
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import example06.junit.group01.Piano;
@SpringBootTest
@ContextConfiguration(classes = ApplicationConfiguration.class)
public class ApplicationConfigurationTest {
@Autowired
private Piano piano;
@Test
public void shouldTestPiano() {
System.err.println("Testing JUnit5 > " + piano);
}
}
我的配置很简单class
@Configuration
@ComponentScan
public class ApplicationConfiguration {
}
我的问题:如果我的测试引用 @SpringBootTest
中列出的 class 中的 @Bean
声明,则自动装配有效。如果它引用 @SpringBootTest
中列出的 class 自动 @ComponentScan
的 class,则自动装配失败。在测试之外,我的应用程序启动时没有自动装配或组件扫描问题,我可以确认我想在测试中加载的服务在非测试中运行良好。我很沮丧。我坏了,还是 Spring Boot 2 上的 Junit5 功能?
我的测试:
@ExtendWith(SpringExtension.class)
@SpringBootTest (classes=MyConfig.class)
public class MyTest {
// fails to autowire
@Autowired
private MyService _mySvc ;
// succeeds!
@Autowired @Qualifier ( "wtf" )
private String _wtf ;
我的配置:
@EnableWebMvc
@SpringBootApplication ( scanBasePackages = "my.packaging" )
@Configuration
public class MyConfig {
@Bean
public String wtf ( ) { return "W T F???" ; }
// No @Bean for MyService because component scan is nicer in the non-test world
我想是因为你这样注释:
@SpringBootTest (classes=MyConfig.class)
Spring 只会在 MyConfig.class
中查找合适的 bean,无法为 MyService
找到合适的 bean,但是,我认为 Spring 会扫描所有当应用程序正常 运行 时,为 bean 打包。这就是它在非测试中运行良好的原因。
我遇到了同样的问题,尽管测试已经开始,但自动装配无法正常工作,问题是我仍在使用旧的 junit4 @Test 注释。 确保您的测试方法使用来自 juni5 包 org.junit.jupiter.api.Test 的 @Test 注释。
正如@Tudro 所说,org.junit.jupiter.api.Test
适用于 Junit 5。org.junit.Test
适用于 Junit 4。
在下面使用这个:
@ExtendedWith(SpringExtension.class)
@SpringBootTest
也许你可以添加 @ContextConfiguration(classes = ApplicationConfiguration.class)
看起来像这样
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import example06.junit.group01.Piano;
@SpringBootTest
@ContextConfiguration(classes = ApplicationConfiguration.class)
public class ApplicationConfigurationTest {
@Autowired
private Piano piano;
@Test
public void shouldTestPiano() {
System.err.println("Testing JUnit5 > " + piano);
}
}
我的配置很简单class
@Configuration
@ComponentScan
public class ApplicationConfiguration {
}