Java 不使用应用程序测试Spring/SpringBoot
我想编写必须使用Spring框架和自定义JPA提供程序的集成测试。正如我所想,简单的答案是创建一个测试类,并按如下方式对其进行注释:Java 不使用应用程序测试Spring/SpringBoot,java,spring,unit-testing,spring-boot,spring-test,Java,Spring,Unit Testing,Spring Boot,Spring Test,我想编写必须使用Spring框架和自定义JPA提供程序的集成测试。正如我所想,简单的答案是创建一个测试类,并按如下方式对其进行注释: @RunWith(SpringRunner.class) @SpringBootTest public class Test { ... 希望所有的默认自动配置都能自行实现。但事实并非如此,错误在于: java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you n
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test { ...
希望所有的默认自动配置都能自行实现。但事实并非如此,错误在于:
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
我是否可以避免创建:
@SpringBootApplication
public class TestApp { ...
并且只使用src/test/java文件夹并提供带有“@SpringBootTest(classes=…)”的配置?那么我需要什么样的配置类呢?我刚刚遇到问题,让我回到开始; 首先添加一个配置类ApplicationContainer
public final class ApplicationContainer {
private static volatile ApplicationContainer singleton;
private ApplicationContext context;
private ApplicationContainer()
{
}
public static ApplicationContainer getInstance()
{
if(ApplicationContainer.singleton == null)
{
synchronized(ApplicationContainer.class)
{
if(ApplicationContainer.singleton == null)
{
ApplicationContainer.singleton = new ApplicationContainer();
}
}
}
return ApplicationContainer.singleton;
}
public void setApplicationContext(ApplicationContext context)
{
this.context = context;
}
public <T> T getBean(Class<T> requiredType)
{
if(this.context == null)
{
throw new IllegalStateException("ApplicationContainer is not started");
}
return this.context.getBean(requiredType);
}
public void start()
{
if(this.context == null)
{
this.context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
}
}
public void stop()
{
if(this.context == null)
{
return;
}
if(this.context instanceof AnnotationConfigApplicationContext)
{
((AnnotationConfigApplicationContext)this.context).close();
}
this.context = null;
}
@Configuration
@ComponentScan("com.domain.package")
public static class ApplicationConfig
{
}}
然后您可以@Autowired您的存储库类并直接使用它。您还应该将它添加到您的测试类名中。@RunWith(SpringRunner.class)@SpringBootTest(class={SpringBootApp.class}),您从哪里获得SpringBootApp.class@仍然需要AA基本配置。SpringBoot应用程序或正常的
配置
。SpringBootApplication是一个元注释,包含SpringBootConfiguration
,它是配置的一种类型。您只需在测试类中创建一个嵌入的静态对象,并使用@SpringBootApplication
对其进行注释即可。请注意,其他测试可能会发现这个问题。请您写一个答案好吗?也许可以更深入地了解为什么需要这样做,比如,SpringBootTest注释到底在寻找什么。测试应处于相同的PackageName错误,java.lang.IllegalStateException如果您尝试在测试时连接数据库,则可以创建application.Test.properties并以这种方式进行配置(您可以将h2用于内存中,也可以连接另一个数据源)我正在测试第三方JPA技术如果您不能使用@DataJpaTest,请不要更改第一个注释并配置application.test.properties这是最简单的方法吗?
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ApplicationContainer.ApplicationConfig.class})
public class YourTestIT {
@Autowired
private ApplicationContext applicationContext;
@Before
public void up() {
ApplicationContainer.getInstance().setApplicationContext(this.applicationContext);
}
@After
public void down() {
ApplicationContainer.getInstance().stop();
}
//test cases
}