Java JUnit—在@Before中一次启动的字段在测试中为空
正如标题所说,尽管我在Java JUnit—在@Before中一次启动的字段在测试中为空,java,junit,Java,Junit,正如标题所说,尽管我在@Before方法中作为一次性设置启动了字段,但我在测试用例中不断获得空字段。唯一的例外是运行的第一个测试有效 我能够用以下代码复制该行为: public class NetworkTest extends TestCase{ private static Boolean oneTimeSetUpDone = false; private Client client; @Before public void setUp(){
@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);
}
在这里我是否遗漏了什么,或者为什么在第一次测试运行后字段会被清除?
@在每次测试之前运行之前-您应该考虑在测试类的新实例中运行的每个@test
,并且在设置该实例之前设置>(专业提示:查看类“.hashCode())
-每种测试方法都不同)
您可以在您的案例中使用
干杯,您的测试类中的每个测试用例都会获得自己的实例变量副本。但是你的静态场
private static Boolean oneTimeSetUpDone = false;
在所有测试用例之间共享。对于每个测试用例,执行@Before方法。发生的情况是,您只为第一个案例初始化实例字段-是if
语句将上述标志设置为true
,从而使其他测试案例的实例变量未初始化
根据实例字段的不同,您有两个选项。首先回答这个问题,对每个测试用例重用相同的实例字段对象有意义吗
如果是这样的话,您可以将它们设置为静态,并且您的@Before方法将像现在一样运行良好。
否则,应删除布尔标志以及if语句。也就是说,您需要为每个测试用例初始化实例变量,因为它们需要为每个测试用例“刷新”
注意:将布尔字段简化为boolean
而不是boolean。
注意:您可以使用@BeforeClass
设置类中的所有测试内容,并仅调用once@NitinDandriyal是的,我知道,但是为什么我在if语句中启动的字段在连续测试中会为null呢?如果只是一次,为什么不呢initializeClient
在声明过程中itselfassertFalse(true)=意味着如果您想重用它,它将失败,因为JUnit在调用每个@TestHmm之前创建了测试类的新实例,好吧,但这肯定也会起作用?它在我之前编写的测试中已经存在,并且我在哪里发布了它。是的,但是您的client
属性也需要是static
(因为它必须在所有类实例之间共享)!事实上,您可以使用标志分散并测试客户端的空值,如果您有点偏执的话,还可以测试同步访问。我接受了答案,但现在我很好奇为什么我以前的设置使用了完全相同的布局,它在if语句中实例化了一个类,然后在整个测试过程中使用它。