Как заполнить базу данных только один раз перед методами @Test в spring test?

моя следующая проблема тестирования уровня весеннего сервиса с junit4: Как вызвать скрипт, который заполняет базу данных только один раз перед всеми @тестовых методов: Я хочу выполнить это один раз перед всеми @ Tests:

JdbcTestUtils.executeSqlScript(jdbcTemplate(), new FileSystemResource(
"src/main/resources/sql/mysql/javahelp-insert.sql"), false);

Я попытался использовать @PostConstruct в моем классе GenericServiceTest (расширенном тестовыми классами). Оказалось, что @PostConstruct вызывается каждый раз перед каждым методом @Test. Интересно, что даже методы, аннотированные @Autowired GenericServiceTest, вызываются перед каждым @Метод испытаний.

Я не хочу заполнять базу данных перед каждым тестовым классом, но только один раз при запуске spring-test.

Как выполнить вышеуказанный метод только один раз перед всеми методами @Test с Spring Testing framework и junit4?

спасибо!

3 ответов


Используйте Встроенную Базу Данных Springs

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:myScript.sql"/>
    <jdbc:script location="classpath:otherScript.sql"/>
</jdbc:embedded-database>

или Springs инициализируют поддержку базы данных

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:myScript.sql"/>
    <jdbc:script location="classpath:otherScript.sql"/>
</jdbc:initialize-database>

@See http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-embedded-database-support


основываясь на ответе Alfredos, это способ ввода информации базы данных без вызова сценария по умолчанию встроенной базы данных. Например, это может быть полезно, когда вы хотите автоматически создать DDL для вас - по крайней мере в тестах.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/applicationContext.xml"})
public class TestClass {

    @Autowired
    private ApplicationContext ctx;

    private JdbcTemplate template;

    @Autowired
    public void setDataSource(DataSource dataSource) {
       template = new JdbcTemplate(dataSource);
    }

    private static boolean isInitialized = false;

    @Before
    public void runOnce() {
        if (isInitialized) return;
        System.out.println("Initializing database");

        String script = "classpath:script.sql"; 
        Resource resource = ctx.getResource(script);
        JdbcTestUtils.executeSqlScript(template, resource, true);            
        isInitialized = true;
    }
}

таким образом,runOnce() метод вызывается только один раз для теста. Если вы сделаете isInitialized поле экземпляра (нестатический) метод будет вызываться перед каждым тестом. Таким образом, вы можете удалить/повторно заполнить таблицы, если необходимо, перед каждым тестовым запуском.

обратите внимание, что это все еще довольно быстрое и грязное решение, и разумный способ обработки базы данных в соответствии с ответом Ральфа.


в случае, если вы весенняя загрузка, u может упомянуть несколько сценариев для запуска перед тестами через

spring.datasource.data=classpath:accounts.sql, classpath:books.sql, classpath:reviews.sql