我是Spring Boot Testing的新手,不确定它是否正确无误。我们正在使用Spring Boot 1.5.8.RELEASE
,包括JUnit 4.12
。在测试过程中,我们好像进行了手动交易处理。我发现以下代码:
@Service
public class DatabaseSessionManager {
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
public void bindSession() {
if (!TransactionSynchronizationManager.hasResource(entityManagerFactory)) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
TransactionSynchronizationManager.bindResource(entityManagerFactory, new EntityManagerHolder(entityManager));
}
}
public void unbindSession() {
EntityManagerHolder emHolder = (EntityManagerHolder) TransactionSynchronizationManager
.unbindResource(entityManagerFactory);
EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());
}
public void begin() {
if (!EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory).getTransaction().isActive()) {
EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory).getTransaction().begin();
}
}
public void commit() {
if (EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory).getTransaction().isActive()) {
EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory).getTransaction().commit();
}
}
}
在我们的测试超类中,我们以以下@Before方法为例:
@Before
public void setup() throws Exception {
sessionManager.unbindSession();
sessionManager.bindSession();
MockSecurityContext();
// databaseChecker.clearRepositories(getEntityClass());
truncateDatabaseService.truncate();
ValidationInfo validationInfo = mapper.readValue(getValidationFile(), ValidationInfo.class);
dummyObject1 = (T) objectBuilder.buildValidObject(validationInfo, "TG");
dummyObject2 = (T) objectBuilder.buildValidObject(validationInfo, "ZH");
patchObject = (T) objectBuilder.buildValidObject(validationInfo, "SG");
patchObject.setId(null);
patchObject.setKanton(null);
sessionManager.commit();
sessionManager.begin();
}
*在buildValidObject()期间,一些相关的子实体被保留。
现在我应该进行一些重构,我不敢相信没有更好的解决方案。其他从事该项目的人说,我们需要提交交易以模拟现实世界的行为。每次使用@After
测试之后,我们都会清除数据库。每个表...这减慢了测试的速度。我正在寻找更好的解决方案。
我认为不可能落实@Before
,@Test
和@After
发生的多个事务吗?
或者我们如何在每次测试之前持久存储数据,然后为测试启动新事务并保持数据库清晰?