我有一个单元测试,我想测试某个运行时异常发生。但是,似乎数据库更改不会在测试类中的每个测试之间回滚,这是正常行为(并且适用于我所有其他测试)。
我试图创建一个问题的最小例子,可以在下面看到。在下面运行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();
}
}
}
答案 0 :(得分:0)
播放不会那样做。你必须手动回滚数据库中的变化:(。在我的项目中,使用ebean,我创建了一个超级类来为我完成这项工作。你可以看看这个gist => https://gist.github.com/asouza/1b415e5582c7b9fff9b0。