我有一个线程,它包含一个线程本地类变量,并以运行单元测试开始:
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) {
// ...
}
}
现在我想运行带有访问(或引用)的线程本地对象foo
的JUnit测试。这可能吗?我试图保持简单,但复杂的事情似乎并不清楚(所以我添加了一些代码):Foo对象需要初始化当前的FooThread
。
答案 0 :(得分:0)
看起来JUnit parameterized unit tests就是您正在寻找的东西。
编辑:基于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。您可以使用JUnit(reference)提供的Runner
以及@RunWith
注释。
答案 1 :(得分:0)
不知道你为什么需要threadLocal。如果您需要使用不同的参数运行相同的测试,那么只需创建这些参数的列表并使用参数化测试(junit的本机或许多库,如zohhak或junit-dataprovider)。
如果由于任何原因你需要在测试中访问本地线程,那么你还需要在测试中插入数据,因为在运行测试之前你不知道将使用什么线程来运行测试。但似乎你可以写一个测试来检查你的代码是否正确使用threadLocal然后参数化测试来检查你的代码是否正确处理了从threadLocal获取的值