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);
}
我是不是遗漏了什么,或者为什么在第一次测试 运行 后字段会被清除?
@Before
在 each 测试之前是 运行 - 你应该在新实例中考虑每个 @Test
运行ning测试 class 和 @Before
设置该实例(专业提示:查看 class' .hashCode()
- 每个测试方法都不同)。
您可以根据自己的情况使用 @BeforeClass
。
干杯,
测试中的每个测试用例 class,都有自己的实例变量副本。但是你的静态字段
private static Boolean oneTimeSetUpDone = false;
在所有测试用例中共享。对于每个测试用例,执行@Before 方法。发生的情况是您仅为第一种情况初始化实例字段 - 是 if
语句将上述标志设置为 true
,从而使其他测试用例的实例变量未初始化。
您有两个选项,具体取决于实例字段。先回答这个问题,对每个测试用例重用相同的实例字段对象有意义吗?
如果是这样,您可以将它们设为静态,并且您的@Before 方法应该像现在一样运行良好。
否则,您应该删除布尔标志以及 if 语句。也就是说,您需要为每个测试用例初始化实例变量,因为它们需要为每个测试用例"fresh"。
P.S。让你的布尔字段简单地 boolean
而不是 Boolean.
正如标题所说,即使我在 @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);
}
我是不是遗漏了什么,或者为什么在第一次测试 运行 后字段会被清除?
@Before
在 each 测试之前是 运行 - 你应该在新实例中考虑每个 @Test
运行ning测试 class 和 @Before
设置该实例(专业提示:查看 class' .hashCode()
- 每个测试方法都不同)。
您可以根据自己的情况使用 @BeforeClass
。
干杯,
测试中的每个测试用例 class,都有自己的实例变量副本。但是你的静态字段
private static Boolean oneTimeSetUpDone = false;
在所有测试用例中共享。对于每个测试用例,执行@Before 方法。发生的情况是您仅为第一种情况初始化实例字段 - 是 if
语句将上述标志设置为 true
,从而使其他测试用例的实例变量未初始化。
您有两个选项,具体取决于实例字段。先回答这个问题,对每个测试用例重用相同的实例字段对象有意义吗?
如果是这样,您可以将它们设为静态,并且您的@Before 方法应该像现在一样运行良好。 否则,您应该删除布尔标志以及 if 语句。也就是说,您需要为每个测试用例初始化实例变量,因为它们需要为每个测试用例"fresh"。
P.S。让你的布尔字段简单地 boolean
而不是 Boolean.