在每次测试之前加载SQL数据库

时间:2014-10-27 07:43:40

标签: java mysql junit4 spring-test

请有人帮我解决以下问题。有没有办法从sql数据文件加载数据库?在我的测试中我使用dbunit。我通常只在我的本地mysql服务器上创建新的数据库模式,然后将所有数据加载到此模式,然后在java中测试它就像这样

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:context/DAOTestContext.xml")
public class HistoricalDataDAOTest {

private final Integer id = 66124;
private final Integer startDate = 20140101;
private final Integer endDate = 20140102;

@Autowired
private HistoricalDataDAO histDataDAO;

public HistoricalDataDAOTest() {
}

@BeforeClass

public static void setUpClass() {

}

@AfterClass
public static void tearDownClass() {
}

@Before

public void setUp() {
}

@After
public void tearDown() {
}

@Test

public void getTest() {
    List portions = histDataDAO.get("ing", startDate, endDate);
    System.out.println(portions);
    assertNotNull(portions);

}

@Test
public void getByOrderIdTest() {

    List<HistoricalPortions> h = histDataDAO.getByOrderId(id);
    assertNotNull(h);
}

}

但我需要在每次测试之前从sql文件加载数据库,我的意思是我想将数据库从sql文件加载到空数据库模式中。在dbunit中有类似的东西 @DatabaseSetup(&#34; test_db.sql&#34;),但我认为这不是sql文件。 拜托,有什么方法可以做到吗?

2 个答案:

答案 0 :(得分:1)

由于您使用的是Spring,因此可以在@Before方法中使用ScriptUtils

Connection connection = dataSource.getConnection();
ScriptUtils.executeSqlScript(connection, new ClassPathResource("test_db.sql"));

答案 1 :(得分:0)

我更喜欢executing SQL scripts declaratively with @Sql

@Sql("/test_db.sql")
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:context/DAOTestContext.xml")
public class HistoricalDataDAOTest {
...
}

我还建议你在测试中使用@Transactional。这将导致数据库的任何更改都回滚。它可以在类或方法级别应用。

手册中有关此内容的章节 -  https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-executing-sql