java - 事务管理似乎不适用于 Spring 测试

标签 java spring hsqldb spring-test spring-mybatis

我希望在使用@Transactional的方法完成后将数据写入数据库。在使用 HSQL 数据库时,这是我的 JUnit 测试的有效假设吗?我使用 HSQL 数据库进行开发,使用 Oracle 进行部署的应用程序。 Web App 部署在WebSphere 上,使用RSA 开发。 下面是我的配置总结,包括POM和junit测试:

POM:
3.2.9.RELEASE
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>

<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.1</version>

APPLICATION CONTEXT:
<!-- the bean for transaction manager for scoping/controlling the transactions -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dbDataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

<jee:jndi-lookup id="dbDataSource" jndi-name="jndi/HSQLDatasource" expected-type="javax.sql.DataSource" />

<!--Mapper-->
<bean id="campaignMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface"
        value="com.abc.persistence.mapper.CampaignMapper" />
    <property name="sqlSessionTemplate">
        <bean class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactoryForBatch" />
            <constructor-arg index="1" value="BATCH" />
        </bean>
    </property>     
</bean>

<!-- SqlSessionFactory For Batch -->
<bean id="sqlSessionFactoryForBatch" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dbDataSource" />
    <property name="typeAliasesPackage" value="com.abc" />
    <property name="mapperLocations" value="classpath*:com/mybatis/mappers/**/*.xml" />
</bean>

JUNIT:
//junit class extends a base class that initializes HSQL db
//jdbcConnection.setAutoCommit(false);

    @Autowired
    CampaignMapper campaignMapper;

    @Transactional
    @Test 
    public void testInsert(){

        for(Campaign record:campaignsFromFile){
            record.setRowLastUpdateId(rowLastUpdateId);
            record.setCampaignId(campaignId);
            campaignMapper.insertCampaignRecord(record);
        }
        //At this point I expect that the data would NOT be written to the database
        //other method code

        }//end of method
        //At this point I expect that the data would be written to the database

最佳答案

默认情况下,Spring 将在测试上下文中回滚事务。如果这不是您期望的行为,您始终可以使用带有 false 值的 @Rollback 注释:

@Transactional
@Test 
@Rollback(false)
public void testInsert() { ... }

如果您使用 Spring 4.2.x 版本,则可以使用新的 @Commit 注释,这是一个新注释,可以用作 @ 的直接替换回滚(假)。您可以在 Spring Test Context here 中阅读有关事务管理的更多信息。 .

关于java - 事务管理似乎不适用于 Spring 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36317682/

相关文章:

sql - HSQLDB 列出所有约束

java - 响应 startActivityForResult

java - spring集成模式 validator 的使用?

java - 如何在hypersql数据库(HSQLDB)中设置Rank函数

java - Postman 请求不起作用 - Rest APi 实现

spring - 如何配置 Spring Boot 以使用 AWS Cognito (OAuth2/OIDC) 对 Web 应用程序用户和 REST 客户端进行身份验证

java - 将 Oracle 日期算术转换为在 HSQLDB 中工作

java - 基于box2D body 角度旋转textureRegion(无 Sprite )

java - Java 中的 HashMap

java - 使用 OnClickListener() 是策略模式的示例吗?