我的Spring-Boot-Mvc-Web应用程序在application.properties
文件中具有以下数据库配置:
spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver
这是我做的唯一配置.我没有任何其他配置.尽管如此,Spring和子系统会在每次运行Web应用程序时自动重新创建数据库.数据库在系统运行时重新创建,而在应用程序结束后包含数据.
我不理解这个默认值,并期望这适合测试.
但是当我开始运行测试时,我发现数据库只重建了一次.由于测试是在没有预定义的顺序执行的,所以这是毫无意义的.
所以,问题是:如何理解?即如何在应用程序首次启动时在每次测试之前重新创建数据库?
我的测试类标题如下:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = myapp.class) //@WebAppConfiguration @WebIntegrationTest @DirtiesContext public class WebControllersTest {
如你所见,我@DirtiesContext
在课堂上尝试过并没有帮助.
UPDATE
我有一个豆子
@Service public class DatabaseService implements InitializingBean {
哪个有方法
@Override @Transactional() public void afterPropertiesSet() throws Exception { log.info("Bootstrapping data..."); User user = createRootUser(); if(populateDemo) { populateDemos(); } log.info("...Bootstrapping completed"); }
现在我做populateDemos()
了清除数据库中所有数据的方法.不幸的是,它在每次测试之前都没有调用过@DirtiesContext
.为什么?
实际上,我想你想要这个:
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
http://docs.spring.io/autorepo/docs/spring-framework/4.2.6.RELEASE/javadoc-api/org/springframework/test/annotation/DirtiesContext.html
@DirtiesContext可以用作同一类中的类级别和方法级别注释.在这种情况下,ApplicationContext将在任何此类带注释的方法之后以及在整个类之后标记为脏.如果将DirtiesContext.ClassMode设置为AFTER_EACH_TEST_METHOD,则在类中的每个测试方法之后,上下文将被标记为脏.
要创建数据库,您必须执行其他答案所说的内容spring.jpa.hibernate.ddl-auto=create-drop
,现在如果您的目的是在每个测试中对数据库进行傀儡,那么spring提供了非常有用的anotation
@Transactional(value=JpaConfiguration.TRANSACTION_MANAGER_NAME) @Sql(executionPhase=ExecutionPhase.BEFORE_TEST_METHOD,scripts="classpath:/test-sql/group2.sql") public class GroupServiceTest extends TimeoffApplicationTests {
来自此包org.springframework.test.context.jdbc.Sql;
,您可以运行before测试方法和after测试方法.填充数据库.
关于每次创建数据库,假设您只希望测试具有create-drop选项,您可以使用带有此批注的自定义属性配置测试
@TestPropertySource(locations="classpath:application-test.properties") public class TimeoffApplicationTests extends AbstractTransactionalJUnit4SpringContextTests{
希望能帮助到你
使用spring boot,可以为每个测试唯一定义h2数据库。只需覆盖每个测试的数据源URL
@SpringBootTest(properties = {"spring.config.name=myapp-test-h2","myapp.trx.datasource.url=jdbc:h2:mem:trxServiceStatus"})
这些测试可以并行运行。
在测试中,可以通过以下方式重置数据:
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
如果使用spring.jpa.hibernate.ddl-auto=create-drop
就足以创建/删除数据库?