2012-09-27 12 views
48

まず、StackOverflowのスレッドに関する多くのスレッドが見つかりましたが、いずれも本当に助けられませんでした。@Testの後のトランザクションのロールバック

私は春検定を使用してJUnitテストを実行しているよ、私のコードは、この

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {}) 
public class StudentSystemTest { 

    @Autowired 
    private StudentSystem studentSystem; 

    @Before 
    public void initTest() { 
    // set up the database, create basic structure for testing 
    } 

    @Test 
    public void test1() { 
    }  
    ... 
} 

のように見える私の問題は、私は私のテストは他のテストに影響を与えないようにするということです。 ですから、私は各テストのためにロールバックのようなものを作りたいと思います。 私はこれをたくさん検索しましたが、これまで何も見つかりませんでした。 私は、あなたがスプリントコンテキストおよびトランザクションマネージャを使用してテストを実行する必要があり、この

+0

ロールバックとはどういう意味ですか?データベースのクリーニング? – Gaurav

+3

'initTest'を実行した後の状態とまったく同じ状態に設定しています。 –

答えて

84

ちょうどあなたのテストの上@Transactional注釈を追加:デフォルトの春では

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"testContext.xml"}) 
@Transactional 
public class StudentSystemTest { 

は終わりにロールバック、あなたの試験方法及び@Before/@Afterコールバックを取り巻く新しいトランザクションを開始します。デフォルトでは動作しますが、コンテキスト内でトランザクションマネージャを使用するだけで十分です。

10.3.5.4 Transaction management(太字鉱山):TestContextフレームワークで

は、トランザクションはTransactionalTestExecutionListenerによって管理されています。テストクラスに@TestExecutionListenersを明示的に宣言していない場合でも、TransactionalTestExecutionListenerはで構成されたです。ただし、トランザクションのサポートを有効にするには、@ContextConfigurationセマンティクスによってロードされるアプリケーションコンテキストにPlatformTransactionManager Beanを指定する必要があります。また、@Transactionalは、テストのクラスまたはメソッドレベルで宣言する必要があります

+0

これを前に試しましたが、まだ動作しません。問題は、PlatformTransactionManagerを定義していないことですそれをしてもいいですか? –

+0

@javo:どのようにデータベースを変更していますか? Jpa/Hibernate/JdbcTemplate /を使用している場合は、いくつかの 'PlatformTransactionManager'が必要です。それ以外の場合、Springはトランザクションとデータベースについてどのように知っていますか? –

+0

この回答のリンクは間違っています。 Springのドキュメントから正しいリンクと詳細については、[user2418306の回答](http://stackoverflow.com/a/35943700/325900)を参照してください。 – DaveyDaveDave

0

のためにHibernateとMySQLを、例えば、

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/your-applicationContext.xml"}) 
@TransactionConfiguration(transactionManager="txMgr") 
public class StudentSystemTest { 

    @Test 
    public void testTransactionalService() { 
     // test transactional service 
    } 

    @Test 
    @Transactional 
    public void testNonTransactionalService() { 
     // test non-transactional service 
    } 
} 

は詳細については春のリファレンスの章10. Testingを参照してください。使用しています

8

@Transactionalを追加することについての回答は正しいですが、簡単にするために、あなたのテストクラスextends AbstractTransactionalJUnit4SpringContextTestsがあります。

@TransactionConfiguration(defaultRollback = false) 

例:

+0

クラスレベルでアノテーション '@Transactional'を追加しても機能しません。 – user3871754

-5

あなたがロールバック無効にすることができ、私が知っている

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration(defaultRollback = false) 
public class Test { 
    @PersistenceContext 
    private EntityManager em; 

    @org.junit.Test 
    public void menge() { 
     PersistentObject object = new PersistentObject(); 
     em.persist(object); 
     em.flush(); 
    } 
} 
+3

これは、OPが求めていることとはちょうど逆です –

2

を、私は答えを投稿するtoooooが遅れていますが、それが誰かを助けるかもしれないことを期待します。さらに、私はテストでこの問題を解決しました。

私のテストクラス

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "path-to-context" }) 
@Transactional 
public class MyIntegrationTest 

コンテキストXML

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

私はまだ、データベースが自動的にクリーンアップされていなかった問題を抱えていた:これは私が私のテストで持っていたものです。私はのBasicDataSource

<property name="defaultAutoCommit" value="false" /> 

に次のプロパティを追加したときに問題が解決された

はそれがお役に立てば幸いです。

+0

あなたは手動で明細書をコミットしますか?あなたのデータはあなたのデータベースにも書かれていますか? –

11

はさておき:トマシュNurkiewiczの答えを改正する試みは拒否されました:

この編集は、ポスト少しでも、見つけやすい、読みやすく、より正確以上のアクセスがありません。変化は完全に不必要であるか、または積極的に読みやすさに害を与える。


正しいと統合テストに関するドキュメントの関連セクションにlink永久。

トランザクションのサポートを有効にするには、@ContextConfigurationセマンティクスを介してロードされるApplicationContextPlatformTransactionManager Beanを設定する必要があります。

 
@Configuration 
@PropertySource("application.properties") 
public class Persistence { 
    @Autowired 
    Environment env; 

    @Bean 
    DataSource dataSource() { 
     return new DriverManagerDataSource(
       env.getProperty("datasource.url"), 
       env.getProperty("datasource.user"), 
       env.getProperty("datasource.password") 
     ); 
    } 

    @Bean 
    PlatformTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 
} 

また、あなたのテストのためのクラスやメソッドレベルのいずれかで春の@Transactional注釈を宣言する必要があります。 @Transactionalと試験方法の注釈

 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {Persistence.class, SomeRepository.class}) 
@Transactional 
public class SomeRepositoryTest { ... } 

テストは、デフォルトでは、自動テストの完了後にロールバックされますトランザクション内で実行されます。テストクラスに@Transactionalという注釈が付けられている場合、そのクラス階層内の各テストメソッドはトランザクション内で実行されます。

関連する問題