Jedną z metod, która działa, jest utworzenie klasy "inicjalizator danych", dodanie jej do kontekstu aplikacji testowej Wiosna, która również ma źródło danych i podłączenie kontekstu aplikacji do testów. To opiera się na fakcie, że Spring buforuje kontekst aplikacji między wywołaniami testu.
Na przykład nadklasą Test:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test-application-context.xml"})
@Transactional
public abstract class DataLoadingTest {
@Autowired
protected DatabaseInitialiser databaseInitialiser;
}
Z test-application-context.xml
:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" .../>
<bean class="DatabaseInitialiser">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
I
public class DatabaseInitialiser extends JdbcDaoSupport {
@PostConstruct
public void load() {
// Initialise your database here: create schema, use DBUnit to load data, etc.
}
}
W tym przykładzie:
- wszystkie testy bazujące na bazie danych rozszerzają się na
DataLoadingTest
;
- Sprężyna inicjalizuje kontekst aplikacji po pierwszym wywołaniu testu;
- to wywołanie
DatabaseInitialiser.load()
, za pomocą adnotacji @PostConstruct
;
- Wiosna zachowuje kontekst aplikacji w pamięci podręcznej;
- Dalszy test wywołania drutu w
DatabaseInitialiser
z kontekstu aplikacji, który jest już buforowany;
- testy są transakcyjne i wycofują się na końcu do początkowego zestawu danych.
Podobnie DatabaseInitialiser
może mieć metody opisywane @PostDestroy
wykonywać żadnych wycofywania potrzeby na końcu całego testu.
To jest dokładnie to, w jaki sposób rozwiązałem problem, po prostu zapomniałem umieścić mój kod/odpowiedź z powrotem w SO. Dziękuję za poświęcenie czasu, aby zrobić to dla następnego faceta. – HDave
Brzmi dobrze, ale w praktyce "@PostConstruct" z drugiej klasy działa wcześniej niż DatabaseInitialiser, więc nie ma sensu. Dzięki za pomoc. –
@ zjednoczona ekspresja: czy możesz to rozwinąć? Którą inną klasę masz na myśli? W podanym przykładzie Spring inicjuje inicjalizator bazy danych przed klasą testową, która działa w sekcji Cass podanej w pytaniu. – Kkkev