4

JPA EntityManager を使用してエンティティを取得および更新する DAO をテストしようとしています。単体テストをトランザクションとしてマークし、defaultRollback プロパティを false に設定しました。ただし、実行時の例外をスローしたときに、テストの最後にトランザクションがロールバックすることはありません。データはDBに永続化されています。これは私のユニットテストコードと春の設定です。私は明らかに何かが欠けていますが、何を特定することができませんでした。ところで、トランザクションはpersistence.xmlのRESOURCE_LOCALです

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring/test-jpa.xml"})
@TestExecutionListeners(
{   DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
@TransactionConfiguration(defaultRollback=false)
@Transactional
public class JpaTests {
    @PersistenceContext
    EntityManage em;

    @Test
    public void testTransactionQueueManager() {
        Object entity = em.find(1);
        //code to update entity omitted.
    entity = em.merge(entity);
    em.flush();
        throw new RuntimeException
    }
}

春の構成

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jpa.driverclassname}" />
    <property name="url" value="${jpa.url}" />
    <property name="username" value="${jpa.username}" />
    <property name="password" value="${jpa.password}" />
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="${jpa.persistenceunitname}"/>
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
            <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DBDictionary"/>
        </bean>
    </property>
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
4

3 に答える 3

0

追加rollbackForすると役立つ場合がありますが、これはよくある落とし穴です。

@Transactional(rollbackFor=Exception.class)
于 2015-11-03T05:51:59.793 に答える
0

@TransactionConfiguration(defaultRollback=false)

犯人かもしれません。トランザクションをロールバックするはずの defaultRollback=true を試してください。

于 2014-03-13T20:57:40.407 に答える