Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Spring mvc 如何高效地为SpringMVC集成测试创建一个基本测试类_Spring Mvc_Integration Testing_Spring Mvc Test - Fatal编程技术网

Spring mvc 如何高效地为SpringMVC集成测试创建一个基本测试类

Spring mvc 如何高效地为SpringMVC集成测试创建一个基本测试类,spring-mvc,integration-testing,spring-mvc-test,Spring Mvc,Integration Testing,Spring Mvc Test,我有一系列的集成测试,我想测试我的SpringMVC/SpringDataJPA堆栈。不幸的是,构建时间是荒谬的,而且随着每次新的集成测试,构建时间只会变得更糟。看起来好像每个单独的测试都要经历创建嵌入式数据库、创建bean等的开销 我有一个基本测试类: @RunWith( SpringJUnit4ClassRunner.class ) @ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = {

我有一系列的集成测试,我想测试我的SpringMVC/SpringDataJPA堆栈。不幸的是,构建时间是荒谬的,而且随着每次新的集成测试,构建时间只会变得更糟。看起来好像每个单独的测试都要经历创建嵌入式数据库、创建bean等的开销

我有一个基本测试类:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = { JpaConfig.class } )
public class BaseItegration {

private static EmbeddedDatabase database;

@BeforeClass
public static void setUp() throws Exception {
    database = new EmbeddedDatabaseBuilder().setType( EmbeddedDatabaseType.H2 ).setName( "mydb" )
        .addScript( "classpath:embeddedDatabase.sql" ).build();
}


@Test
    public void testInit() {
        Assert.assertNotNull( database );
    }
其中,我的JpaConfig.java:

@Configuration
@EnableTransactionManagement
@ComponentScan( basePackages = { "org.myproject.service", "org.myproject.utility",
      "org.myproject.controller", "org.myproject.utility.startup",
      "org.myproject.security" } )
@ImportResource( { "classpath:applicationContext.xml", "classpath:myproject-spring-security.xml" } )
public class JpaConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {...}
    @Bean
    public DataSource dataSource() {...}

    <etc>
}
在查看构建日志时,我可以看到每个测试的应用程序初始化。有没有办法让BaseIntegrationTest只启动一个测试,每个测试都使用该应用程序上下文和embeddeddatabase

========

更新 我将我的JPA更改为:

@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType( EmbeddedDatabaseType.H2 ).setName( "mydb" )
                .addScript( "classpath:embeddedDatabase.sql" ).build();
}
我的BaseIntegration现在为空:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( loader = AnnotationConfigContextLoader.class, classes = { JpaConfig.class } )
public abstract class BaseItegration {

}
以下是因错误而失败的测试之一:

InvalidDataAccessResourceUsageException(表“ADDRESSTYPEREF”不是 找到;SQL语句:

@TransactionConfiguration(defaultRollback=true)
@事务性(传播=propagation.NESTED)
公共类TestSeedAddressTypesIT扩展了BaseIteration{
@自动连线
私有AddressTypeRefRepository addressTypeRepository;
@自动连线
私有SeedAddressTypes SeedAddressTypes;
//黑客,因为我们不能用Autowired做BeforeClass
私有布尔种子=false;
@试验
public void testRepositoryNotNull(){
Assert.assertNotNull(addressTypeRepository);
}
@试验
public void testPopulatedDB(){
如果(!种子){
seedAddressTypes.seed();
种子=真;
}
List addressTypes=addressTypeRepository.findAll();
Assert.assertEquals(5,addressTypes.size());
}
}

然而,所有的集成测试似乎都会重新创建applicationContext和嵌入式数据库。虽然构建日志没有显示正在创建的数据源,但我确实看到每个集成测试都会创建一个新的log4j文件,45个测试需要15分钟来构建。

似乎@BeforeClass意味着任何带有@BeforeClass注释的静态方法都会在之前运行因此,如果您有一个包含多个类的测试套件,它的运行次数与您的测试类的数量相同

为什么不在单独的applicationContext中初始化嵌入式数据库和真实数据库,并在测试中只添加嵌入式数据库applicationContext

例如(对不起,我不熟悉java配置样式):

清单1:embedded-database.xml

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
然后使用applicationContext启动嵌入式数据库(因此只启动一次)

另一个解决方案是使用Spring概要文件,您不必在单独的XML中分离数据库

清单1:your-application-context.xml

<bean profile="integrationTest">
    <jdbc:embedded-database id="dataSource">
        <jdbc:script location="classpath:schema.sql"/>
        <jdbc:script location="classpath:test-data.sql"/>
    </jdbc:embedded-database>
<bean>

<bean profile="production">
    //omitted 
</bean>
请记住在web.xml中激活生产

更新:


将BaseIntegration修改为抽象类以解决no@Test方法问题。数据源是否在日志中创建?

AFAIK,不应为每个测试重新创建spring上下文。如何运行您的测试?您确定没有将测试运行程序配置为为为每个测试生成新的JVM吗?我正在使用“mvn clean verify”为了构建WAR文件,我修改了BaseItemgration,使其不再创建嵌入式数据库,并更改了JPA配置以创建作为数据源的嵌入式数据库。但现在我所有的集成测试都失败了,因为它们找不到数据库。我更改了我的问题以反映这些问题changes@sonoerin更新了,你能发布一个吗关于BaseIntegration子类?我用抽象基类和示例测试更新了我的帖子。我没有看到正在创建数据源,但每次测试都会创建日志文件,85个测试的总构建时间为15分钟。
<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations = { "classpath:your-application-without-a-real-database.xml", "classpath:"embedded-database.xml" } )
public class BaseItegration {


}
<bean profile="integrationTest">
    <jdbc:embedded-database id="dataSource">
        <jdbc:script location="classpath:schema.sql"/>
        <jdbc:script location="classpath:test-data.sql"/>
    </jdbc:embedded-database>
<bean>

<bean profile="production">
    //omitted 
</bean>
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations = { "classpath:your-application-context.xml" } )
@ActiveProfiles("integrationTest")
public class BaseItegration {


}