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

时间:2015-05-12 09:47:02

标签: java junit

就像标题所说的那样,即使我已经在@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);
    }

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

2 个答案:

答案 0 :(得分:5)

@Before每次测试之前运行 - 您应该考虑在测试类的新实例中运行的每个@Test,并@Before设置实例(专业提示:查看课程' .hashCode() - 每种测试方法都有所不同)。

您可以在案件中使用@BeforeClass

干杯,

答案 1 :(得分:1)

测试类中的每个测试用例都获取它自己的实例变量副本。但是你的静态字段

private static Boolean oneTimeSetUpDone = false;

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

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

如果是的话,你可以让它们变成静态的,你的@Before方法应该像现在一样好。 否则,您应该删除布尔标志以及if语句。也就是说,您需要为每个测试用例初始化实例变量,因为每个测试用例都需要“新鲜”。

P.S。使您的布尔字段只是boolean而不是Boolean.