我的Spring-Boot-Mvc-Web应用程序在application.properties文件中具有以下数据库配置:
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在课堂上尝试过,但没有帮助。
@DirtiesContext
更新
I have a bean
@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。为什么?
populateDemos()
实际上,我认为你想要这样做:
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
@DirtiesContext可以用作同一类中的类级和方法级批注。在这种情况下,ApplicationContext将在任何此类带注释的方法之后以及在整个类之后标记为dirty。如果DirtiesContext.ClassMode设置为AFTER_EACH_TEST_方法,则在类中的每个测试方法之后都会将上下文标记为dirty。