5

SpringアプリケーションのJUnitテストで、セットアップメソッドに大量のデータを挿入し、それを使用してテストしたいと思います。ただし、@Beforeメソッドに注釈を付けたとしても、メソッドで行われたことはすべて、各テストの後にロールバックされているように見えます。@Rollback(false)

これが私がやろうとしていることの単純化されたバージョンです:

public class TestClass
{
   @Autowired 
   MyService service;

   @Before
   public void setup()
   {
      if(service.getById(1) == null)
      {
         Thing thing = new Thing();
         thing.setId(1);
         service.create(new Thing(1))
      }
   }
}

も使用してみまし@BeforeClassたが、メソッドが静的である必要があり、setterメソッドが呼び出される前に実行される@Autowiredため、実行時に呼び出す必要のあるサービスにアクセスできません@BeforeClass

を使用してみ@PostConstructましたが、トランザクションを使用できるようにすることに問題があります(そして、トランザクションの開始時にのみHibernateセッションを使用できるように設定されています)。奇妙なことに、セッションが利用可能であるように見えましたが、同じセッション内から取得した2つのオブジェクトが等しくなかったため、Hibernateの第1レベルのキャッシュが失敗したか、各操作が別々のセッションで発生していました。@BeforeTransaction同じ振る舞いを示しているようでした。

4

1 に答える 1

2

Spring TransactionalTestExecutionListenerは、Junit テストのトランザクションの管理を担当します。2 つのメソッド ( beforeTestMethodafterTestMethod ) を使用して、各 Junit テストのトランザクションを開始および終了します。

@Before アノテーションとしてはこんな感じで、 @Before アノテーションで setUp メソッドに Test メソッドで指定した@Rollback属性を適用する

プロセスを説明するためにこの例があります.2つのテストメソッドがあります.1つは(ロールバックfalse、もう1つはロールバックtrue)

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class})
      @Transactional
       public class MyTest 
      {

        @Before
        public void setUp()
        {
            //When executing this method setUp
            //The transaction will be rolled back after rollBackTrue Test
            //The transaction will not be rolled back after rollBackFalse Test
         }


        @Test
        @Rollback(true)
        public void rollBackTrue()
        {
            Assert.assertTrue(true);
        }

        @Test
        @Rollback(false)
        public void rollBackFalse()
        {
            Assert.assertTrue(true);
        }
    }
于 2012-01-13T21:30:10.813 に答える