gpt4 book ai didi

java - Junit Spring 避免加载两次应用程序上下文数据源

转载 作者:行者123 更新时间:2023-11-29 10:08:42 25 4
gpt4 key购买 nike

我有这个配置类:

@ComponentScan(
basePackages = {
"mypackage.controller",
"mypackage.service",
"mypackage.repository"
}
)
@TestPropertySource(locations="classpath:configuration.properties")
@Import({
H2Configuration.class
})
public class TestConfiguration {
}

@Configuration
public class H2Configuration {

@Bean
public DataSource dataSource() throws SQLException {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder
.setType(EmbeddedDatabaseType.H2)
.addScript("h2/create.sql")
.addScript("h2/insert.sql")
.build();
db.getConnection().setAutoCommit(false);
return db;
}

}

我有这两个类测试:

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

@Autowired
MyFirstRepositoryImpl repository;

@Before
public void initTest() {
}

@Test(expected = NullPointerException.class)
public void testNullRecords() {
repository.foo(null, null);
}
}


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

@Autowired
MySecondRepositoryImpl repository;

@Before
public void initTest() {
}

@Test(expected = NullPointerException.class)
public void testSomethingNullRecords() {
repository.something(null, null);
}
}

如果我为每个类(class)运行一次 junit 测试,一切顺利。

在全新安装阶段测试失败,因为应用程序上下文被初始化了两次。

例如,它尝试创建两次 h2 表并执行两次 insert.sql 脚本。

我需要做什么来初始化 h2 数据库,这样应用程序上下文只需一次?

谢谢

最佳答案

我认为您可以开始查看有关 Integration Testing 的 Spring 文档.

将事务测试用于集成测试 (@Transactional) 也是一种很好的做法,它会在每个测试结束时回滚:参见 Transaction Management .

为了避免为每个测试类重新创建 ApplicationContext 的成本,可以按照此处的说明使用缓存:Context Caching .

对于与嵌入式数据库 的集成测试,您还可以找到文档:Testing Data Access Logic with an Embedded Database .来自上一个链接的注释,与您的用例相匹配:

However, if you wish to create an embedded database that is shared within a test suite, consider using the Spring TestContext Framework and configuring the embedded database as a bean in the Spring ApplicationContext as described in Creating an Embedded Database by Using Spring XML and Creating an Embedded Database Programmatically.

希望您能找到一些有用的引用资料。

关于java - Junit Spring 避免加载两次应用程序上下文数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com