Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用应用程序测试Spring/SpringBoot_Java_Spring_Unit Testing_Spring Boot_Spring Test - Fatal编程技术网

Java 不使用应用程序测试Spring/SpringBoot

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

我想编写必须使用Spring框架和自定义JPA提供程序的集成测试。正如我所想,简单的答案是创建一个测试类,并按如下方式对其进行注释:

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