我正在为一种服务编写JUnit测试,该服务以各种方式创建并作用于实体。我希望我的测试尝试许多不同的活动组合。我有这样的事情:
test1() {
/** create entity **/
/** assert **/
}
test2() {
/** do X to entity **/
/** assert **/
}
test3() {
/** do X again to entity, expect failure **/
/** assert **/
}
test4() {
/** do Y to entity, expect success **/
/** assert **/
}
但是,我的理解是我不能指望JUnit以正确的顺序运行测试,并且每个测试应该完全自包含。
但如果我让每个测试都自包含,那么就会有很多重复的代码,事情运行得相当长,并且维护起来比较困难......例如:
test1() {
/** create entity **/
/** assert **/
}
test2() {
/** create entity **/
/** do X to entity **/
/** assert **/
}
test3() {
/** create entity **/
/** do X to entity **/
/** do X again to entity, expect failure **/
/** assert **/
}
test4() {
/** create entity **/
/** do X to entity **/
/** do X again to entity, expect failure **/
/** do Y to entity, expect success **/
/** assert **/
}
...如果你跟着我。
所以我的问题是,编写这些测试的“正确”方法是什么,以便代码干净优雅?
谢谢,Rob
答案 0 :(得分:5)
您可以使用@Before
带注释的方法初始化要在测试中使用的实体。
然后,使用@After
带注释的方法清除/释放测试使用的所有资源。
你可以:
private Entity entity;
@Before
public void init() {
entity = ...
}
@Test
public void test1() {
// do things to entity
...
}
答案 1 :(得分:3)
您可以在每个测试方法中调用一个设置方法来处理重复的代码。
即
test1() {
setup();
/** create entity **/
/** assert **/
}
test2() {
setup();
/** create entity **/
/** do X to entity **/
/** assert **/
}
setup(){
/**perform setup here*/
}
答案 2 :(得分:1)
哪种更易读?
@OrderRunner
public class EntityTest {
Entity e;
shouldBeCreatedInValidState() {
e = new Entity();
assert(e.isValid());
}
shouldBeWigglable() {
e.wiggle();
assert(e.hasBeenWiggled());
}
shouldNotBeWigglableTwice() {
try {
e.wiggle();
fail("Wiggled too many times")
} catch(OverWiggledException e) {}
}
}
或
public class EnttityTest {
shouldBeCreatedInValidState() {
Entity e = new Entity();
assert(e.isValid());
}
shouldBeWigglable() {
Entity e = new Entity();
e.wiggle();
assert(e.hasBeenWiggled());
}
shouldNotBeWigglableTwice() {
Entity e = new Entity();
e.wiggle();
try {
e.wiggle();
fail("Wiggled too many times")
} catch(OverWiggledException e) {}
}
}
我的偏好是后者。该属性很容易被遗漏,因此第二次“摆动”看起来就像是在考试中的原因一瞥。
如果设置/测试方法更复杂,那么创建方法。
shouldNotBeWigglableTwice() {
givenAnEntity();
andIWiggleIt();
try {
whenIWiggleIt();
thenItShouldThrowAnException();
} catch(OverWiggledException e) {}
}