是否有任何扩展JUnit4测试类的约定?

时间:2013-03-03 08:02:20

标签: java unit-testing intellij-idea junit4

我的测试有很多共同的逻辑,所以我决定通过扩展来分享它。我写了两个类: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测试类的约定?

更新:

  1. 测试在IDEA中运行
  2. 为了得到如此奇怪的结果,我已多次运行它们(其他结果与预期一致)

4 个答案:

答案 0 :(得分:2)

这绝对是Intellij IDEA的问题。如果我通过maven运行你的代码,它运行正常。

如果我在Intellij中运行它几次,有时会得到不正确的输出。

实际上我找到了重现它的方法:

  • 在每个输出消息后添加Thread.sleep(1000)。
  • 在“运行测试”窗口中打开“跟踪运行测试”(运行测试列表上方的蓝色圆圈)
  • 在Intellij中运行整个TestNumberOne测试类(即使您只有一个测试方法) - >输出应该是正确的顺序
  • 点击测试列表中的anyTest方法,然后点击TestNumberOne - >输出的顺序不正确

(同样如果你在睡眠状态下运行它,你会看到输出的顺序正确,但在测试结束时会重新排序)

所以按正确顺序运行,只输出混乱。

答案 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。