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呢?如果只是一次,为什么不呢initialize
Client
在声明过程中itselfassertFalse(true)=意味着如果您想重用它,它将失败,因为JUnit在调用每个@TestHmm之前创建了测试类的新实例,好吧,但这肯定也会起作用?它在我之前编写的测试中已经存在,并且我在哪里发布了它。是的,但是您的
client
属性也需要是
static
(因为它必须在所有类实例之间共享)!事实上,您可以使用标志分散并测试
客户端的空值,如果您有点偏执的话,还可以测试
同步访问。我接受了答案,但现在我很好奇为什么我以前的设置使用了完全相同的布局,它在if语句中实例化了一个类,然后在整个测试过程中使用它。