java 为什么我不能在ThreadLocal中获取它定义的类之外的存储的String对象?

bq9c1y66  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(68)

我正在尝试将BaseClass中ThreadLocal中存储的String Object获取到TestClass。在下面的代码中,我定义了ThreadLocal并通过set()方法存储了一个String。但是当我试图在扩展BaseClass的TestClass中获取存储的字符串时,它变成了null。我错过了什么?
我的BaseClass代码如下:

package base;

import org.testng.annotations.BeforeSuite;

public class BaseClass {

    private static final ThreadLocal<String> str = new ThreadLocal<>();

    public void setString(String string){
        str.set(string);
    }

    public static String getString(){
        return str.get();
    }

    @BeforeSuite
    public void setDesiredString(){
        String desiredString = "I am a String.";
        setString(desiredString);
    }

}

我的TestClass代码如下:

package tests;

import base.BaseClass;
import org.testng.Assert;
import org.testng.annotations.Test;

public class TestClass extends BaseClass {

    String str = getString();

    @Test
    public void TestString() {

        Assert.assertEquals(str,"I am a String." );
    }

}

当我运行TestClass时,我得到以下输出:

java.lang.AssertionError:
Expected :I am a String.
Actual   :null

我希望有一个通过的测试,具有相同的预期和实际字符串,存储在ThreadLocal在BaseClass通过setDesiredString(),这是“我是一个字符串。”

tyg4sfes

tyg4sfes1#

你可以像下面这样的基类来使它工作

import org.testng.annotations.BeforeSuite;

public class BaseClass {

    private static final ThreadLocal<String> str = new ThreadLocal<>();

    public void setString(String string) {
        str.set(string);
    }

    public String getString() {
        return str.get();
    }

    @BeforeSuite
    public void setDesiredString() {
        String desiredString = "I am a String.";
        setString(desiredString);
    }

}

在Test类中调用Threadlocal getter方法

import org.testng.Assert;
import org.testng.annotations.Test;

public class TestClass extends BaseClass {

    @Test
    public void TestString() {

        Assert.assertEquals(getString(), "I am a String.");
    }

}

相关问题