Play Framework 2(Java)中的单元测试不会回滚测试之间的更改

时间:2014-07-16 12:21:37

标签: java playframework playframework-2.2 ebean transactional

我有一个单元测试,我想测试某个运行时异常发生。但是,似乎数据库更改不会在测试类中的每个测试之间回滚,这是正常行为(并且适用于我所有其他测试)。

我试图创建一个问题的最小例子,可以在下面看到。在下面运行TestTest时,在第二次测试运行时,Unique index or primary key violation方法中MyClass.create("abc")的调用会得到setUp()

问题似乎需要这种特定的设置:即使是最轻微的改变也会使问题消失,例如:如果换一个两个测试的名字;如果试图简化调用方法等的一些方法级别;或者,如果使用的课程不是@Entity,或者课程不是@Transactional

我根本就不明白这一点。有人可以帮忙吗?

我使用的是Play Framework 2.2(Java版)。

单元测试类:

public class TestTest extends WithApplication {
    @Before
    public void setUp() {
        start(fakeApplication(inMemoryDatabase(), fakeGlobal()));
        MyClass.create("abc");
    }

    @Test(expected = RuntimeException.class)
    public void test1() {
        MyClass c = MyClass.create("blabla");
        c.foo();
    }

    @Test
    public void test2() {
        assert(true);
    }
}

MyClass的实现:

@Entity
public class MyClass extends Model {

    @Id
    public Long id;

    @Column(unique = true)
    public String name;

    private MyClass(String name) {
        this.name = name;
    }

    public static MyClass create(String name) {
        MyClass c = new MyClass(name);
        c.save();
        return c;
    }

    @Transactional(type = TxType.REQUIRED)
    public void foo() {
        Bar bar = new Bar();
        bar.foo();
    }

    class Bar {
        void foo() {
            throw new RuntimeException();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

播放不会那样做。你必须手动回滚数据库中的变化:(。在我的项目中,使用ebean,我创建了一个超级类来为我完成这项工作。你可以看看这个gist => https://gist.github.com/asouza/1b415e5582c7b9fff9b0