JUnit 定义了Request契约接口(其实是一个抽象类), 便于其他的装置(比如maven, eclipse等ide工具)触发Junit执行,这个接口的定义如下:
1 2 3 4 5 6 |
public abstract class Request { public static Request aClass(Class<?> clazz) { return new ClassRequest(clazz); } public abstract Runner getRunner(); } |
一堆根据Class创建Request实例的的静态方法, 以及getRunner()方法, getRunner()的默认实现为根据@RunWith注解选择合适的Runner(BlockJUnit4ClassRunner, Suite, SpringJUnit4ClassRunner)等,
Runner主要的方法如下
1 2 3 4 |
public abstract class Runner implements Describable { public Runner(Class<?> clazz); public abstract void run(RunNotifier notifier); } |
在构造函数中完成初始化,BlockJUnit4ClassRunner的实现是通过反射查找传入的类中(@Test, @Before等注解的方法),
run()表示开始执行该类中定义的Test case。
Junit将执行@Test注解的方法的每一步抽象为一个Statement对象, 类似servlet的filter
1 2 3 4 |
public abstract class Statement { private final Statement next; public abstract void evaluate() throws Throwable; } |
next指针定义在子类中的(便于叙述仿真Statement中),因为有些Statement不需要下一步动作, 比如Fail对象
假设有如下测试对象,
1 2 3 4 5 6 7 8 |
public class JunitTest { @BeforeClass public static void beforeClass() {} @Before public void before() {} @Test public void test() {} } |
那么Statement的链式结构如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
BeforeStatement { .....处理@BeforeClass注解的方法 next = AllTestAnnotationedMethodStatement{ for(FrameworkMethod...) { //参考BlockJUnit4ClassRunner.methodBlock 中构建过程 withBeforesStatement{ .....处理@Before注解的方法 next = methodInvokerStatement { .....处理@Test注解的方法 } } } } } |
Posted in: java基础
Comments are closed.