В идеале я хотел бы иметь возможность:
- создать схему тестовой БД (из аннотированных классов JPA) один раз до запуска тестов
По крайней мере, Hibernate позволяет создавать базу данных из аннотированных классов, я думаю, что другие реализации JPA тоже будут работать.
- запускать каждый метод тестирования по-своемутранзакция, которая откатывается после завершения теста
См. @ TransactionConfiguration и значение defaultRollback , а также AbstractTransactionalJUnit4SpringContextTests (есть также похожие абстрактные классы, по крайней мере, для JUnit 3.8 и TestNG), внимательно посмотрите на См. также -разделы в javadocs, они указывают на множество очень полезных связанных классов и аннотаций.
- задает набор данных (DbUnit), который будет загружен для каждого теста на уровне класса или метода.Тестовые данные должны быть загружены после начала транзакции, чтобы тестовые данные также были откатаны после завершения теста
Я фактически никогда не использовал DbUnit, но по крайней мере сJUnit, вы можете использовать @ Before и @ BeforeClass для запуска методов перед каждым тестом и классом соответственно (есть также @After и @AfterClass).Если у вас есть иерархия классов, методы, аннотированные @ Before / @ BeforeClass, запускаются в порядке расширения (сначала базовый класс).Для запуска sql-сценариев см., Например, SimpleJdbcTestUtils .
- для внедрения Spring-бинов в тестовый класс
AbstractTransactionalJUnit4SpringContextTests isApplicationContextAware, также см. @ ContextConfiguration для настройки.
Наконец, вот немного урезанный базовый класс, который я использую для расширения моих реальных интеграционных тестов (Spring 3, JUnit4, Hibernate как JPA-провайдер, если это имеет значение):
//test-context, same as normal context, except uses H2 for in-memory database and has some stuff for faking session- and request-scope
@ContextConfiguration(locations="classpath:applicationContext-test.xml")
@TransactionConfiguration(transactionManager="txManager", defaultRollback=true)
@Transactional
public abstract class IntegrationTestBase extends AbstractTransactionalJUnit4SpringContextTests
{
@PersistenceContext
protected EntityManager em;
@Autowired
protected SomeService serviceAvailableToSubclasses;
@Before
public void beforeEachTest()
{
//fill database with testdata and whatever you need to, runs before each test in extending classes
}
@After
public void afterEachTest()
{
//Do something, if you need to, or just remove this
}
}
Исходя из этого, вы можете использовать @Transactional, @Autowired и т. д. в своих производных классах или получить более конкретные абстрактные тестовые базовые классы (у меня есть, например, IntegrationSessionTestBase иIntegrationSessionNewRequestPerTestBase для различных видов тестов, требующих новых сеансов и / или запросов на тест).