就像标题所说的那样,即使我已经在@Before
方法中作为一次性设置启动了它们,我仍然会在测试用例中获得无效的字段。唯一的例外是第一个运行的测试有效。
我能够使用以下代码复制行为:
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);
}
我在这里遗漏了什么或为什么在第一次测试运行后字段会被清除?
答案 0 :(得分:5)
@Before
在每次测试之前运行 - 您应该考虑在测试类的新实例中运行的每个@Test
,并@Before
设置实例(专业提示:查看课程' .hashCode()
- 每种测试方法都有所不同)。
您可以在案件中使用@BeforeClass
。
干杯,
答案 1 :(得分:1)
测试类中的每个测试用例都获取它自己的实例变量副本。但是你的静态字段
private static Boolean oneTimeSetUpDone = false;
在所有测试用例之间共享。对于每个测试用例,都执行@Before方法。发生的情况是,您只是为第一种情况初始化实例字段 - 它是if
语句,将上面的标志设置为true
,从而使其他测试用例的实例变量保持未初始化。
您有两种选择,具体取决于实例字段。首先回答这个问题,为每个测试用例重用相同的实例字段对象是否有意义?
如果是的话,你可以让它们变成静态的,你的@Before方法应该像现在一样好。 否则,您应该删除布尔标志以及if语句。也就是说,您需要为每个测试用例初始化实例变量,因为每个测试用例都需要“新鲜”。
P.S。使您的布尔字段只是boolean
而不是Boolean.