如何在JUnit测试之间共享状态?

时间:2012-07-10 09:50:06

标签: java junit

我有一个测试类,使用多个测试方法扩展junit.framework.TestCase。每个方法打开一个到服务器的HTTP连接,并交换请求和响应json字符串。一个方法得到一个带有一个名为UID的字符串的响应(类似于sessionId)我需要在后续的服务器请求中使用它。

我之前将该字符串写入文件,我的下一个请求读取该文件的字符串。我一次运行一个方法。现在我正在尝试使用该字符串而不进行文件操作。我保持一个hastable(因为那里为了这个目的,我在我的测试类中跟踪了许多UID作为实例变量,但最终发现每次方法调用时都会加载类,因为我的静态块每次都在执行。这导致丢失那些UID。 / p>

如何在不写入文件和阅读文件的情况下实现这一目标?

我怀疑我的标题是否符合我的要求。有人请相应地编辑。

2 个答案:

答案 0 :(得分:5)

您需要一个静态变量,因为每个测试都有自己的测试类实例。

使用此模式:

private static String uuid;

private void login() {
    // Run this only once
    if (null != uuid) return;

    ... talk to your server ...
    uuid = responseFromServer.getUuid();
}

@Test
public void testLogin() {
    login();
    assertNotNull( uuid );
}

@Test
public void someOtherTest() {
    login();

    ... test something else which needs uuid ...
}

@Test
public void testWithoutLogin() {
    ... usual test code ...
}

这种方法可以确保为每个需要它的测试调用login(),它可以自己测试,并且可以独立运行每个测试。

答案 1 :(得分:5)

JUnit将为每个测试创建一个新的类实例。因此,您应该使用@BeforeClass带注释的静态方法将此信息设置为静态并保存到类中。

有关详细信息,请参阅this SO answer