Spring / JUnit测试-每个测试处理多个事务

时间:2019-05-08 12:20:31

标签: unit-testing spring-boot junit spring-transactions

我是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发生的多个事务吗?

或者我们如何在每次测试之前持久存储数据,然后为测试启动新事务并保持数据库清晰?

0 个答案:

没有答案