我有一个线程,它初始化了一个线程本地类变量,并以运行单元测试开始:
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
。
2条答案
按热度按时间lymgl2op1#
看起来JUnit parameterized unit tests就是您要寻找的。
编辑:基于JUnit wiki上提供的示例的示例代码:
注意:如果您使用提供程序,您也可以在不使用Parameterized runner的情况下运行测试(只需从
@Before
方法中的提供程序获取一个新对象),但由于我对您的代码或需求了解不多,因此我将把该选择留给您。另外,您不需要示例化自己的JUnit Runner,可以使用JUnit(reference)提供的
Runner
和@RunWith
注解。xqnpmsa82#
不知道为什么你需要threadLocal。如果你需要用不同的参数运行相同的测试,那么只需要创建一个这些参数的列表,并使用参数化测试(junit的原生或许多库,如zohhak或junit-dataprovider)。
如果出于任何原因,您需要在测试中访问threadlocal,那么您还需要在测试中向其插入数据,因为在运行测试之前,您不知道将使用哪个线程来运行测试。但看起来您仍然可以编写一个测试来检查您的代码是否正确使用threadLocal,然后编写参数化测试来检查您的代码是否正确处理从threadLocal获取的值