Вопрос

В моих модульных тестах я работал с некоторыми данными, которые используют 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);
        }
}

Это то, что мы делаем в начале каждого теста.

  1. Отбросьте все предыдущие объекты.

  2. Создайте все таблицы, упомянутые в create_table.sql

  3. Вставьте значения в созданные таблицы на основе того, что вы хотите проверить.

      @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");
    
      }
    

Работает как очарование!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top