不确定是否有人仍在使用 JUnit 并尝试在不使用 Spring Runner 的情况下修复它(也就是没有 spring 集成)。TestNG 有这个功能。但这是一个基于 JUnit 的解决方案。
像这样为每个线程操作创建一个 RunOnce。这维护了操作已运行的类的列表。
public class RunOnceOperation {
private static final ThreadLocal t = new ThreadLocal();
public void run(Function f) {
if (t.get() == null) {
t.set(Arrays.asList(getClass()));
f.apply(0);
} else {
if (!((List) t.get()).contains(getClass())) {
((List) t.get()).add(getClass());
f.apply(0);
}
}
}
}
回到你的单元测试
@Before
public beforeTest() {
operation.run(new Function<Integer, Void>() {
@Override
public Void apply(Integer t) {
checkBeanProperties();
return null;
}
});
}
private void checkBeanProperties() {
//I only want to check this once per class.
//Also my bean check needs instance of the class and can't be static.
}
My function interface is like this:
interface Function<I,O> {
O apply(I i);
}
当您使用这种方式时,您可以使用 ThreadLocal 对每个类执行一次操作。