gpt4 book ai didi

java - 为什么 jUnit 的 fixtureSetup 必须是静态的?

转载 作者:IT老高 更新时间:2023-10-28 11:23:50 26 4
gpt4 key购买 nike

我用 jUnit 的 @BeforeClass 注释标记了一个方法,并得到这个异常说它必须是静态的。理由是什么?这迫使我所有的 init 都在静态字段上,据我所知没有充分的理由。

在 .Net (NUnit) 中,情况并非如此。

编辑 - 使用 @BeforeClass 注释的方法只运行一次这一事实与它是静态方法无关 - 一个非静态方法可以只运行一次(如在 NUnit 中) )。

最佳答案

JUnit 总是 为每个@Test 方法创建一个测试类的实例。 This is a fundamental design decision使编写测试更容易而没有副作用。好的测试没有任何运行顺序的依赖(参见 F.I.R.S.T),并且为每个测试创建新的测试类实例及其实例变量对于实现这一点至关重要。一些测试框架为所有测试重用相同的测试类实例,这导致在测试之间意外产生副作用的可能性更大。

而且因为每个测试方法都有自己的实例,所以 @BeforeClass/@AfterClass 方法是实例方法是没有意义的。否则,应该在哪个测试类实例上调用方法?如果 @BeforeClass/@AfterClass 方法可以引用实例变量,那么只有一个 @Test 方法可以访问这些相同的实例变量 - 其余的实例变量位于它们的默认值 - 并且 @Test 方法将被随机选择,因为 .class 文件中的方法顺序是未指定/编译器相关的(IIRC,Java 的反射 API 以与它们在 . class 文件,尽管该行为也未指定 - 我已经写了 a library 用于实际按行号对它们进行排序)。

因此,将这些方法强制为静态是唯一合理的解决方案。

这是一个例子:

public class ExampleTest {

@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass");
}

@AfterClass
public static void afterClass() {
System.out.println("afterClass");
}

@Before
public void before() {
System.out.println(this + "\tbefore");
}

@After
public void after() {
System.out.println(this + "\tafter");
}

@Test
public void test1() {
System.out.println(this + "\ttest1");
}

@Test
public void test2() {
System.out.println(this + "\ttest2");
}

@Test
public void test3() {
System.out.println(this + "\ttest3");
}
}

哪些打印:

beforeClass
ExampleTest@3358fd70 before
ExampleTest@3358fd70 test1
ExampleTest@3358fd70 after
ExampleTest@6293068a before
ExampleTest@6293068a test2
ExampleTest@6293068a after
ExampleTest@22928095 before
ExampleTest@22928095 test3
ExampleTest@22928095 after
afterClass

如您所见,每个测试都使用自己的实例执行。 JUnit 做的和这个基本一样:

ExampleTest.beforeClass();

ExampleTest t1 = new ExampleTest();
t1.before();
t1.test1();
t1.after();

ExampleTest t2 = new ExampleTest();
t2.before();
t2.test2();
t2.after();

ExampleTest t3 = new ExampleTest();
t3.before();
t3.test3();
t3.after();

ExampleTest.afterClass();

关于java - 为什么 jUnit 的 fixtureSetup 必须是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1052577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com