Junit + Derby + Spring: DB в памяти после каждого теста
-
12-10-2019 - |
Вопрос
В моих модульных тестах я работал с некоторыми данными, которые используют URL -адреса, такие как
jdbc:derby:memory:mydb;create=true
Чтобы создать DBS в памяти.
Чтобы сбросить Derby DB в памяти, вы должны связаться:
jdbc:derby:memory:mydb;drop=true
Я бы хотел, чтобы это произошло после каждого теста и начало со свежего БД. Как я могу сделать это с помощью весны?
Решение 2
Как правильно выключить базу данных Derby в памяти
дал мне намек на решение:
mydb.drop.url = jdbc:derby:memory:mydb;drop=true
...
<bean id="mydbDropUrl" class="java.lang.String">
<constructor-arg value="${mydb.drop.url}" />
</bean>
...
@Resource
private String mydbDropUrl;
@After
public void tearDown() {
try {
DriverManager.getConnection(mydbDropUrl);
} catch (SQLException e) {
// ignore
}
}
Недостатком является использование строкового конструктора, который принимает строку (неподвижный объект строки вокруг неизменного строкового объекта). Я читал, что весной 3 есть аннотация @value, что может помочь здесь, но я использую Spring 2.5.
Пожалуйста, дайте мне знать, если у вас есть более приятное решение.
Другие советы
Существует алкогольный способ сделать это, если вы используете пружину вместе с Hibernate.
Убедитесь, что контекст приложения будет создан / уничтожен до / после каждого метода испытаний:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:application-context-test.xml"})
@TestExecutionListeners({DirtiesContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class AbstractTest {
}
Инструктируйте Hibernate для автоматического создания схемы при запуске и отбросить схему при выключении:
hibernate.hbm2ddl.auto = create-drop
Теперь перед каждым тестом
- Контекст приложения создается, и необходимые пружинные бобы вводится (пружина)
- Структуры базы данных создаются (спят)
- import.sql выполняется, если присутствует (Hibernate)
и после каждого теста
- Контекст приложения разрушен (весна)
- Схема базы данных отбрасывается (Hibernate).
Если вы используете транзакции, вы можете добавить TransactionalTestExecutionListener
.
После весеннего теста 3 вы можете использовать аннотации для введения конфигураций:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-test.xml")
public class MyTest {
}
Просто сделай что -нибудь вроде:
public class DatabaseTest implements ApplicationContextAware {
private ApplicationContext context;
private DataSource source;
public void setApplicationContext(ApplicationContext applicationContext) {
this.context = applicationContext;
}
@Before
public void before() {
source = (DataSource) dataSource.getBean("dataSource", DataSource.class);
}
@After
public void after() {
source = null;
}
}
Сделайте ваш фасоль иметь масштаб прототипа (scope="prototype"
) Это получит новый экземпляр источника данных перед каждым тестом.
Если вы используете Spring-test.jar Библиотека, вы можете сделать что -то вроде этого:
public class MyDataSourceSpringTest extends
AbstractTransactionalDataSourceSpringContextTests {
@Override
protected String[] getConfigLocations() {
return new String[]{"classpath:test-context.xml"};
}
@Override
protected void onSetUpInTransaction() throws Exception {
super.deleteFromTables(new String[]{"myTable"});
super.executeSqlScript("file:db/load_data.sql", true);
}
}
И обновленная версия, основанная на последнем комментарии, которая отбрасывает DB и воссоздает таблицы перед каждым тестом:
public class MyDataSourceSpringTest extends
AbstractTransactionalDataSourceSpringContextTests {
@Override
protected String[] getConfigLocations() {
return new String[]{"classpath:test-context.xml"};
}
@Override
protected void onSetUpInTransaction() throws Exception {
super.executeSqlScript("file:db/recreate_tables.sql", true);
}
}
Это то, что мы делаем в начале каждого теста.
Отбросьте все предыдущие объекты.
Создайте все таблицы, упомянутые в create_table.sql
Вставьте значения в созданные таблицы на основе того, что вы хотите проверить.
@Before public void initialInMemoryDatabase() throws IOException, FileNotFoundException { inMemoryDerbyDatabase.dropAllObjects(); inMemoryDerbyDatabase.executeSqlFile("/create_table_policy_version_manager.sql"); inMemoryDerbyDatabase.executeSqlFile("/insert_table_policy_version_manager.sql"); }
Работает как очарование!