99

まず、これについて StackOverflow で多くのスレッドを見つけましたが、どれも実際には役に立たなかったので、重複した質問をして申し訳ありません。

spring-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() {
    }    
    ...  
}

私の問題は、自分のテストが他のテストに影響を与えないようにしたいということです。そこで、テストごとにロールバックのようなものを作成したいと思います。私はこれをたくさん検索しましたが、これまでのところ何も見つかりませんでした。これにはHibernateとMySqlを使用しています

4

7 に答える 7

146

@Transactionalテストの上に注釈を追加するだけです。

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

デフォルトでは、Spring はテスト メソッドとコールバックを囲む新しいトランザクションを開始@Before@After、最後にロールバックします。これはデフォルトで機能します。コンテキスト内にトランザクション マネージャーがあれば十分です。

From: 10.3.5.4 トランザクション管理(太字の鉱山):

TestContext フレームワークでは、トランザクションは TransactionalTestExecutionListener によって管理されます。テストクラスで明示的に宣言していなくても、デフォルトで構成されTransactionalTestExecutionListenerていることに注意してください。ただし、トランザクションのサポートを有効にするには、セマンティクスによってロードされるアプリケーション コンテキストで Bean を提供する必要があります。さらに、テストのクラス レベルまたはメソッド レベルで宣言する必要があります。@TestExecutionListenersPlatformTransactionManager@ContextConfiguration@Transactional

于 2012-09-27T17:08:55.587 に答える
19

余談: Tomasz Nurkiewicz の回答を修正しようとする試みは拒否されました:

この編集によって、投稿が少しでも読みやすくなり、見つけやすくなり、正確になり、アクセスしやすくなるわけではありません。変更は完全に不必要であるか、可読性を積極的に損なうかのいずれかです。


統合テストに関するドキュメントの関連セクションへの正しい恒久的なリンク。

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

@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テストのクラス レベルまたはメソッド レベルで Spring のアノテーションを宣言する必要があります。

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

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

于 2016-03-11T15:14:06.440 に答える
14

追加に言及している答え@Transactionalは正しいですが、簡単にするために、 test class を持つことができますextends AbstractTransactionalJUnit4SpringContextTests

于 2012-09-27T17:40:31.560 に答える
3

メソッドの追加に加え@Transactional@Test、追加する必要もあります@Rollback(false)

于 2020-08-18T06:47:33.757 に答える
2

Spring コンテキストとトランザクション マネージャーを使用してテストを実行する必要があります。

@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
     }
}

3.5.8. Transaction Management詳細については、Spring リファレンスの章を参照してください。

于 2012-09-27T17:04:44.717 に答える
-7

ロールバックを無効にすることができます:

@TransactionConfiguration(defaultRollback = false)

例:

@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();
    }
}
于 2016-01-04T09:47:43.950 に答える