Junit - 运行设置方法一次

Bob*_*r02 114 java junit

我设置了一个带有几个测试的类,而不是使用@Before我希望有一个在所有测试之前只执行一次的设置方法.Junit 4.8有可能吗?

Ale*_*exR 198

虽然我同意@assylias认为使用@BeforeClass是一种经典的解决方案,但并不总是方便.注释的方法@BeforeClass必须是静态的.对于需要测试用例的一些测试来说非常不方便.例如,基于Spring的测试@Autowired用于处理spring上下文中定义的服务.

在这种情况下,我个人使用setUp()@Before注释的常规方法注释并管理我的自定义static标志:

private static boolean setUpIsDone = false;
.....
public void setUp() {
    if (setUpIsDone) {
        return;
    }
    // do the setup
    setUpIsDone = true;
}
Run Code Online (Sandbox Code Playgroud)

  • 添加肯尼·卡森关于为什么它必须是静态的评论.它必须是静态的,因为JUnit为每个@Test方法实例化了一个新的测试类实例.如果实例变量不是静态的,则它将被重置为每个实例的默认值(false).有关详细信息,请参阅:http://martinfowler.com/bliki/JunitNewInstance.html (9认同)
  • 除了在`setUp()`方法在超类中的情况下 - 这已经发布了[answer](http://stackoverflow.com/questions/12087959#31117171)以下试图解决此问题. (2认同)
  • 我很犹豫地对84k代表说这句话,但是BeforeClass实际上并没有回答这个问题:BeforeClass在每个测试类的开头运行。但是,OP要求它运行“在所有测试之前仅运行一次”。您提出的解决方案可以做到这一点,但是您必须使所有测试类都扩展一个“ CommonTest”类。 (2认同)

ass*_*ias 85

您可以使用BeforeClass注释:

@BeforeClass
public static void setUpClass() {
    //executed only once, before the first test
}
Run Code Online (Sandbox Code Playgroud)

  • 我不能使用它,我有一些基于非静态组件的设置方法,如getClass() (11认同)
  • 当然你不能使用`TheClassYouWant.class`而不是你的getClass()调用?这是实际的Java:`String.class.getName()`. (2认同)

Bri*_*ian 27

JUnit 5现在有一个@BeforeAll注释:

表示应在当前类或类层次结构中的所有@Test方法之前执行带注释的方法; 类似于JUnit 4的@BeforeClass.这些方法必须是静态的.

JUnit 5的生命周期注释似乎终于搞定了!您可以猜测哪些注释无需查看(例如@BeforeEach @AfterAll)

  • 它有同样的问题是`@ BeforeClass`,它需要是`static`.IMO @ AlexR的解决方案更好. (5认同)

Ste*_*ers 8

setUp()在测试类的超类中时,接受的答案可以修改如下:

public abstract class AbstractTestBase {
    private static Class<? extends AbstractTestBase> testClass;
    .....
    public void setUp() {
        if (this.getClass().equals(testClass)) {
            return;
        }

        // do the setup - once per concrete test class
        .....
        testClass = this.getClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该适用于单个非静态setUp()方法,但是我不能在tearDown()不偏离复杂反射的世界的情况下产生等价物......赏金指向任何可以做到的人!


Dee*_*pak 7

JUnit 5 @BeforeAll 可以是非静态的,前提是测试类的生命周期是每个类,即用 a 注释测试类,@TestInstance(Lifecycle.PER_CLASS)然后就可以开始了