1

我有一个线程,它初始化一个线程局部类变量并从运行单元测试开始:

public class FooThread extends Thread {
    TestRunner runner;
    Foo foo;

    public void run() {
        initSomeThreadLocalStuff(); // inits foo and runner
        runner.runJUnitTests(); // JUnitCore.runTest(TestClass)
    }

    private void initSomeThreadLocalStuff() {
        foo = new Foo(this);
        // ...
    }
}

public class Foo() {
    public Foo(FooThread t) {
        // ...
    }    
}

现在我想通过访问(或引用)线程本地对象来运行 JUnit 测试foo。这可能吗?我试图保持简单,但复杂的事情似乎并不清楚(所以我添加了一些代码): Foo 对象需要FooThread初始化当前的。

4

2 回答 2

0

看起来 JUnit参数化单元测试是您正在寻找的。

编辑:基于 JUnit wiki 上提供的示例的示例代码:

@RunWith(Parameterized.class)
public class Test {

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {{ new ThreadLocalProvider() }});
    }

    @Parameter(value = 0) // first data value (0) is default
    public /* NOT private */ ThreadLocalProvider tloProvider;

    public ThreadLocal<Object> tlo;

    @Before
    public void setup() {
        // getNew() will be called in the same thread in which the unit test will run.
        tlo = tloProvider.getNew();
    }

    @Test
    public void test() {
        // Test using tlo.
    }
}

class ThreadLocalProvider {
    public ThreadLocal<Object> getNew() {
        // Instantiate a *new* ThreadLocal object and return it.
    }
}

注意:如果您使用提供程序,您也可以在不使用参数化运行程序的情况下运行测试(只需在@Before方法中从提供程序获取一个新对象),但由于我对您的代码或要求不太了解,所以我会把选择权留给你。

此外,您不需要实例化您自己的 JUnit Runner。您可以将RunnerJUnit 提供的 ( reference ) 与@RunWith注释一起使用。

于 2015-01-12T12:13:04.730 回答
0

不知道为什么需要threadLocal。如果您需要使用不同的参数运行相同的测试,那么只需创建这些参数的列表并使用参数化测试(junit 的本机或许多库,如 zohhak 或 junit-dataprovider)。

如果出于某种原因您需要在测试中访问本地线程,那么您还需要在测试中插入数据,因为在运行测试之前您不知道将使用哪个线程来运行测试。但似乎您仍然可以编写一个测试来检查您的代码是否正确使用 threadLocal,然后参数化测试以检查您的代码是否正确处理从 threadLocal 获取的值

于 2016-09-21T14:37:22.850 回答