JUnit - 一次在@Before 中启动的字段在测试中为空

JUnit - fields that are one time initiated in @Before are null in tests

正如标题所说,即使我在 @Before 方法中将它们作为 one-time set-up 启动,我仍然在测试用例中不断获取空字段。唯一的例外是 运行s 的第一个测试有效。

我能够使用以下代码复制该行为:

public class NetworkTest extends TestCase{
    private static Boolean oneTimeSetUpDone = false;
    private Client client;

    @Before
    public void setUp(){
        if(!oneTimeSetUpDone){
            client = new Client();

            oneTimeSetUpDone = true;
        }   
    }

    @Test
    public void testConnection(){
        System.out.println(client);
        assertFalse(true);
    }

    @Test
    public void testMultiConnection(){
        System.out.println(client);
        assertFalse(true);
    }

我是不是遗漏了什么,或者为什么在第一次测试 运行 后字段会被清除?

@Beforeeach 测试之前是 运行 - 你应该在新实例中考虑每个 @Test 运行ning测试 class 和 @Before 设置该实例(专业提示:查看 class' .hashCode() - 每个测试方法都不同)。

您可以根据自己的情况使用 @BeforeClass

干杯,

测试中的每个测试用例 class,都有自己的实例变量副本。但是你的静态字段

private static Boolean oneTimeSetUpDone = false;

在所有测试用例中共享。对于每个测试用例,执行@Before 方法。发生的情况是您仅为第一种情况初始化实例字段 - 是 if 语句将上述标志设置为 true,从而使其他测试用例的实例变量未初始化。

您有两个选项,具体取决于实例字段。先回答这个问题,对每个测试用例重用相同的实例字段对象有意义吗?

如果是这样,您可以将它们设为静态,并且您的@Before 方法应该像现在一样运行良好。 否则,您应该删除布尔标志以及 if 语句。也就是说,您需要为每个测试用例初始化实例变量,因为它们需要为每个测试用例"fresh"。

P.S。让你的布尔字段简单地 boolean 而不是 Boolean.