Sle*_*led 11 java junit junit4
我有一个JUnit测试类的JUnit套件.如果在该测试方法上存在某个注释,我想在套件上定义一个规则,以便在运行每个单元测试之前和之后对数据库执行某些操作.
我已经能够在套件和测试类中创建一个@ClassRule,它将在每个类之前执行此操作(这不够好)并且我已经能够使用测试类本身定义测试规则,但是这样是重复的,似乎不是很干.
是否可以在套件中定义每个测试方法规则,还是必须将它们添加到每个测试中?
编辑:为了澄清,我想在套件中声明代码,它将在测试类中的测试方法之间运行(即"围绕").
Mat*_*ell 15
这可以做到,但需要一些工作.您还需要定义自己的Suite runner和您自己的Test runner,然后在测试运行器中覆盖runChild().使用以下Suite和Test类:
@RunWith(MySuite.class)
@SuiteClasses({Class1Test.class})
public class AllTests {
}
public class Class1Test {
@Deprecated @Test public void test1() {
System.out.println("" + this.getClass().getName() + " test1");
}
@Test public void test2() {
System.out.println("" + this.getClass().getName() + " test2");
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已注释test1()了@Deprecated.当您@Deprecated在测试中使用注释时,您希望做一些不同的事情,因此我们需要扩展Suite以使用自定义Runner:
public class MySuite extends Suite {
// copied from Suite
private static Class<?>[] getAnnotatedClasses(Class<?> klass) throws InitializationError {
Suite.SuiteClasses annotation = klass.getAnnotation(Suite.SuiteClasses.class);
if (annotation == null) {
throw new InitializationError(String.format("class '%s' must have a SuiteClasses annotation", klass.getName()));
}
return annotation.value();
}
// copied from Suite
public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
super(null, getRunners(getAnnotatedClasses(klass)));
}
public static List<Runner> getRunners(Class<?>[] classes) throws InitializationError {
List<Runner> runners = new LinkedList<Runner>();
for (Class<?> klazz : classes) {
runners.add(new MyRunner(klazz));
}
return runners;
}
}
Run Code Online (Sandbox Code Playgroud)
JUnit Runner为每个将运行的测试创建一个.通常,Suite只会创建默认值BlockJUnit4ClassRunner,我们在这里所做的就是覆盖Suite的构造函数,它从SuiteClass注释中读取类,我们用它们创建自己的运行器,MyRunner.这是我们的MyRunner课程:
public class MyRunner extends BlockJUnit4ClassRunner {
public MyRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
Description description= describeChild(method);
if (method.getAnnotation(Ignore.class) != null) {
notifier.fireTestIgnored(description);
} else {
if (description.getAnnotation(Deprecated.class) != null) {
System.out.println("name=" + description.getMethodName() + " annotations=" + description.getAnnotations());
}
runLeaf(methodBlock(method), description, notifier);
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中大部分是复制而来的BlockJUnit4ClassRunner.我添加的位是:
if (description.getAnnotation(Deprecated.class) != null) {
System.out.println("name=" + description.getMethodName() + " annotations=" + description.getAnnotations());
}
Run Code Online (Sandbox Code Playgroud)
我们在哪里测试方法上是否存在@Deprecated注释,如果存在则执行某些操作.其余部分留给读者练习.当我运行上面的套件时,我得到输出:
name=test1 annotations=[@java.lang.Deprecated(), @org.junit.Test(expected=class org.junit.Test$None, timeout=0)]
uk.co.farwell.junit.run.Class1Test test1
uk.co.farwell.junit.run.Class1Test test2
Run Code Online (Sandbox Code Playgroud)
请注意,Suite具有多个构造函数,具体取决于它的调用方式.以上适用于Eclipse,但我还没有测试过运行Suite的其他方法.有关详细信息,请参阅Suite的各种构造函数旁边的注释.
| 归档时间: |
|
| 查看次数: |
9905 次 |
| 最近记录: |