我的测试有很多共同的逻辑,所以我决定通过扩展来分享它。我写了两个类:TestNumberOne
,它扩展了TestBase
。
TestBase.java
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
/**
* @author Pavel
* @since 2013-03-03
*/
public class TestBase {
@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass() in TestBase");
System.out.flush();
}
@AfterClass
public static void afterClass() {
System.out.println("afterClass() in TestBase");
System.out.flush();
}
@Before
public void before() {
System.out.println("before() in TestBase");
System.out.flush();
}
@After
public void after() {
System.out.println("after() in TestBase");
System.out.flush();
}
}
TestNumberOne.java
import org.junit.*;
/**
* @author Pavel
* @since 2013-03-03
*/
public class TestNumberOne extends TestBase {
@Test
public void anyTest() {
System.out.println("anyTest() in TestNumberOne");
System.out.flush();
}
}
当我执行测试时,我有一个奇怪的输出:
before() in TestBase
anyTest() in TestNumberOne
after() in TestBase
beforeClass() in TestBase
afterClass() in TestBase
为什么命令如此奇怪?是否有任何扩展JUnit测试类的约定?
更新:
答案 0 :(得分:2)
这绝对是Intellij IDEA的问题。如果我通过maven运行你的代码,它运行正常。
如果我在Intellij中运行它几次,有时会得到不正确的输出。
实际上我找到了重现它的方法:
(同样如果你在睡眠状态下运行它,你会看到输出的顺序正确,但在测试结束时会重新排序)
所以按正确顺序运行,只输出混乱。
答案 1 :(得分:1)
当我尝试你的代码时,我只得到预期的输出,即
beforeClass() in TestBase
before() in TestBase
anyTest() in TestNumberOne
after() in TestBase
afterClass() in TestBase
(使用Eclipse启动)。 哪个是惯例^^你的结果真的很奇怪......
答案 2 :(得分:0)
不知道任何约定。在junit 3中,基类通常是抽象的。
以下似乎是以合理的顺序出现的(除了撕裂之外)。
import org.junit.*;
public class BaseTestCase {
public static String method() {
return Thread.currentThread().getStackTrace()[2].getMethodName() + "()";
}
@BeforeClass public static void classSetupBaseClass() {
System.out.println(method());
}
@AfterClass public static void classTeardownBaseClass() {
System.out.println(method());
}
@Before public void setupBaseClass() {
System.out.println(method());
}
@After public void teardownBaseClass() {
System.out.println(method());
}
@Test public void aTestInBaseClass() {
System.out.println(method());
}
}
import static org.junit.Assert.*;
import org.junit.*;
public class So15183669 extends BaseTestCase {
@BeforeClass public static void classSetup() {
System.out.println(method());
}
@AfterClass public static void classTeardown() {
System.out.println(method());
}
@Before public void setup() {
System.out.println(method());
}
@After public void teardown() {
System.out.println(method());
}
@Test public void aTest() {
System.out.println(method());
}
}
classSetupBaseClass()
classSetup()
setupBaseClass()
setup()
aTest()
teardown()
teardownBaseClass()
setupBaseClass()
setup()
aTestInBaseClass()
teardown()
teardownBaseClass()
classTeardown()
classTeardownBaseClass()
答案 3 :(得分:0)
我认为当你运行测试时,你的TestBase也会按照自己的junit测试运行。请尝试将其称为HelperBase。