在spring test中@Test方法之前只填充一次数据库?

时间:2014-03-31 20:18:16

标签: spring junit spring-jdbc spring-test

我在这个问题上遇到了同样的问题:

How to populate database only once before @Test methods in spring test?

但是这个解决方案对我来说是不可接受的,因为它会为我的所有测试类运行相同的脚本。 我想要的是只为每个测试类运行一次不同的脚本。 到目前为止,我找到的唯一解决方案是在@Before方法中添加一个if

2 个答案:

答案 0 :(得分:1)

除非您愿意为每个测试加载(并缓存)不同的ApplicationContext(请参阅下文),否则您唯一的选择是定义static boolean字段并将其设置为{{1填充数据库的方法,如果它是类中的第一次运行。我想通过在@Before方法中if来表达你的意思。

现在,如果您愿意为每个测试类加载不同的@Before,则可以定义一个唯一的ApplicationContext类或XML配置文件,用于填充给定测试类的数据库。然后,您可以注释您的测试类,如:

@Configuration

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/standard-test-config.xml", "TestClass1-config.xml" })
@DirtiesContext( classMode = ClassMode.AFTER_CLASS )
public class TestClass1 { / * ... */ }

然后,您可以在@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { StandardTestConfig.class, TestClass1.Config.class }) @DirtiesContext( classMode = ClassMode.AFTER_CLASS ) public class TestClass1 { / * ... */ } 课程中使用XML中的<jdbc:embedded-database ...><jdbc:initialize-database ...>EmbeddedDatabaseBuilderResourceDatabasePopulatorDatabasePopulatorUtils}。< / p>

当然,为这样的每个测试类加载不同的@Configuration可能会极大地降低测试套件的速度,尤其是ApplicationContext需要很长时间才能加载。因此,您需要考虑到这一点。

此致

萨姆

答案 1 :(得分:0)

注释@BeforeClass允许为一组测试运行初始化代码。这是javadoc

的摘录
  

有时,多个测试需要共享计算成本高昂的设置   (比如登录数据库)。虽然这可以妥协   测试的独立性,有时候是必要的优化。   使用@BeforeClass注释public static void no-arg方法会导致   它在类中的任何测试方法之前运行一次。该   超级类的@BeforeClass方法将在那些之前运行   现在的课程。