gpt4 book ai didi

java - 是否可以在接口(interface)内创建 JUnit 规则

转载 作者:行者123 更新时间:2023-11-30 11:15:58 25 4
gpt4 key购买 nike

我正在尝试使用 JUnit 创建测试自动化套件。对于所有测试,我想创建一个规则,为此我创建了一个接口(interface)并将规则放入其中。我想运行的任何测试都必须实现该接口(interface)。它没有抛出任何编译器错误,但是,当我的测试类实现该接口(interface)时,这似乎不起作用。以下是我创建的界面。

public interface IBaseTest {
@Rule
public TestRule test = new TestWatcher(){
@Override
protected void starting(Description description)
{
System.out.println("Starting Test: " + description);
}
};
}

或者,我可以将上面的内容创建为一个类,并从该类扩展我的所有测试类,我试过了并且它工作得很好,但是这会阻止我从任何其他类扩展我的测试方法。

有没有一种方法可以让我创建适用于我所有测试的规则,而无需从基类扩展?

最佳答案

是的,我知道有一种方法,但它会让您编写一些额外的代码。

首先,JUnit 忽略您的 TestRule 的原因是因为它是在接口(interface)上声明的,因此是静态的(和最终的)。

要克服这个问题,需要像这样编写一个自定义运行程序:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

import org.junit.Rule;
import org.junit.rules.TestRule;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;

public final class MyRunner extends BlockJUnit4ClassRunner {

public MyRunner(Class<?> klass) throws InitializationError {
super(klass);
}

@Override
protected List<TestRule> getTestRules(Object target) {
List<TestRule> testRules = super.getTestRules(target);
testRules.addAll(getStaticFieldTestRules(target));
return testRules;
}

private List<TestRule> getStaticFieldTestRules(Object target) {
List<TestRule> testRules = new ArrayList<>();
Class<?> clazz = target.getClass();
for (Field f : clazz.getFields()) {
if ((f.getModifiers() & Modifier.STATIC) != 0) {
if (f.isAnnotationPresent(Rule.class)) {
try {
testRules.add((TestRule) f.get(target));
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
}
}
return testRules;
}
}

最后,注释您的测试类以使用新的自定义运行器运行,一切都如您所愿...

import org.junit.runner.RunWith;

@RunWith(MyRunner.class)
public class Test implements IBaseTest {

@org.junit.Test
public void testName1() throws Exception {
}

@org.junit.Test
public void testName2() throws Exception {

}

}

关于java - 是否可以在接口(interface)内创建 JUnit 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25101884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com