【发布时间】:2023-03-30 10:42:02
【问题描述】:
我有这个配置类:
@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);
}
}
如果我为每个类运行一次 junit 测试,一切顺利。
在全新安装阶段测试失败,因为应用程序上下文被初始化了两次。
例如,它尝试创建两次 h2 表并执行两次 insert.sql 脚本。
我必须做些什么来初始化 h2 数据库和应用程序上下文一次?
谢谢
【问题讨论】:
-
NB
db.getConnection().setAutoCommit(false);很浪费(因为它从数据源获取单个连接并将该连接上的自动提交设置为 false)并泄漏连接(返回的连接是可能来自池支持的源)。你应该删除那行代码。
标签: java spring applicationcontext