1

Spring Roo In Action (Manning の本) を参考にしています。本のどこかに「Roo はテスト クラスをマークし@Transactional、ユニット テストが変更を自動的にロールバックするようにします

説明方法は次のとおりです。

@Test
@Transactional
  public void addAndFetchCourseViaRepo() {
    Course c = new Course();
    c.setCourseType(CourseTypeEnum.CONTINUING_EDUCATION);
    c.setName("Stand-up Comedy");
    c.setDescription(
      "You'll laugh, you'll cry, it will become a part of you.");
    c.setMaxiumumCapacity(10);

    c.persist();
    c.flush();
    c.clear();  
    Assert.assertNotNull(c.getId());

    Course c2 = Course.findCourse(c.getId());
    Assert.assertNotNull(c2);
    Assert.assertEquals(c.getName(), c2.getName());
    Assert.assertEquals(c2.getDescription(), c.getDescription());
    Assert.assertEquals(
      c.getMaxiumumCapacity(), c2.getMaxiumumCapacity());
    Assert.assertEquals(c.getCourseType(), c2.getCourseType());
  }

ただし、RuntimeException が発生しない場合、このメソッドの変更が自動的にロールバックされる理由がわかりません...

4

2 に答える 2

4

ドキュメントからの引用:

デフォルトでは、フレームワークはテストごとにトランザクションを作成してロールバックします。トランザクションの存在を想定できるコードを書くだけです。[...] さらに、トランザクション内での実行中にテスト メソッドが選択したテーブルの内容を削除すると、トランザクションはデフォルトでロールバックされ、データベースはテスト実行前の状態に戻ります。トランザクション サポートは、テストのアプリケーション コンテキストで定義された PlatformTransactionManager Bean を介してテスト クラスに提供されます。

つまり、SpringJUnit4ClassRunnerテストを実行する人は、テストの実行後に常にトランザクションのロールバックを行います。

于 2012-07-04T12:57:30.320 に答える
0

リストの要素の 1 つが確立されたビジネス ルール内の理由で失敗した場合 (つまり、カスタマイズ例外をスローした場合)、ロールバックを実行できる方法を見つけようとしています。

例 (リスト内の 1 つの要素が失敗した場合、アイデアは何も記録しません)

public class ControlSaveElement {

 public void saveRecords(List<MyRecord> listRecords) {

  Boolean status = true;

  foreach(MyRecord element: listRecords) {
     // Here is business rules
     if(element.getStatus() == false) {
        // something
        status = false;
     }
     element.persist();
  }

  if(status == false) {
     // I need to do roll back from all elements persisted before
  }
 }

...
}

何か案が?Roo 1.2.2 で作業しています。

于 2012-11-21T16:13:05.210 に答える