【问题标题】:How do I share state between JUnit tests?如何在 JUnit 测试之间共享状态?
【发布时间】:2012-07-10 09:50:06
【问题描述】:

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

我之前将该字符串写入文件,我的下一个请求读取该文件以获取字符串。我一次运行一个方法。现在我试图在没有文件操作的情况下使用该字符串。我维护了一个 hastable(因为那里有许多 UID 需要跟踪)在我的测试类中作为实例变量用于此目的,但最终发现由于我的静态块每次都在执行,因此我的每个方法调用都加载了该类。这导致这些 UID 丢失。

如何在不写入文件并从中读取的情况下实现此目的?

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

【问题讨论】:

    标签: java junit


    【解决方案1】:

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

    使用这种模式:

    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(),它是独立测试的,并且您可以独立运行每个测试。

    【讨论】:

      【解决方案2】:

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

      请参阅this SO answer 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 2010-11-12
        • 1970-01-01
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多