集成测试单独工作,但不能在Spring Boot应用程序

时间:2015-11-11 14:59:07

标签: hibernate spring-boot hsqldb spring-test mockmvc

似乎我在这里遗漏了一些必要的东西,但我没有设法自己找到它。

我有一个Spring Boot应用程序和Hibernate,我试图通过一些集成测试来测试。我在测试时使用的是HSQL数据库。我试图运行的测试使用MockMvc检查我的控制器返回的json响应。

我让我的测试类扩展了一个配置类,该类使用@Before和@After初始化测试数据并在之后将其删除。

所以,在我的单个测试课中,我有四个测试。只做简单的基本事情,比如返回列表和单个对象。他们都只是在阅读数据。

@Test
public void testGetSingleData() throws Exception {
    this.mockMvc.perform(get("/api/data/{id}", 1)
            .andExpect(status().isOk());
}
@Test
public void testGetListData() throws Exception {
    this.mockMvc.perform(get("/api/data/", 1)
            .andExpect(status().isOk());
}
…
and so on.

当我单独运行这些测试时,这是一次一个,它们都可以正常工作。我得到了预期的输出。但是,当一起运行四个测试时,其中一个不会返回相同的响应。事实上,它什么都没有回归。更具体地说,testGetSingleData测试在单独运行时返回一个对象。与其他测试一起运行时,它什么都不返回。我的控制器说数据不在数据库中。     在我看来,测试之间的数据库正在发生一些事情。当然数据已初始化并被删除,但这应该没问题。例如,运行返回对象列表的两个测试可以正常工作,但不能与返回单个对象的测试一起使用。因此,当testGetSingleData运行时,数据会以某种方式消失。 我想我需要一个潜在的原因来解释为什么会这样。单独运行的测试在与其他测试一起运行时无法正常运行的错误来源是什么?

我的课程«test-config-class»注释为:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(loader = SpringockitoAnnotatedWebContextLoader.class, classes = Application.class)
@TestPropertySource(locations = "classpath:config/application.properties")

修改

@Autowired
private EntityManagerFactory firstDbEntityManager;  
@Autowired
private EntityManagerFactory secondDbEntityManager;
protected SessionFactory firstDbSessionFactory;
protected SessionFactory secondDbSessionFactory;

@Before
public void initSessionFactories() {
    if (firstDbSessionFactory == null) {
        firstDbSessionFactory = firstDbEntityManager.unwrap(SessionFactory.class);
    }
    if (secondDbSessionFactory == null) {
        secondDbSessionFactory = secondDbEntityManager.unwrap(SessionFactory.class);
    }

    initTestData();

}


@After
public void cleanDatabase() {
    doCleanDatabase(firstDbEntityManager);
    doCleanDatabase(secondDbEntityManager);
}

private void doCleanDatabase(EntityManagerFactory entityManagerFactory) {
        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
        session.createSQLQuery("truncate schema public and commit").executeUpdate();
        session.flush();
        session.close();
}

0 个答案:

没有答案