资讯专栏INFORMATION COLUMN

[深入JUnit] @Before, @After, @Test的秘密

dongfangyiyu / 3350人阅读

摘要:最近对和的内部实现比较感兴趣,将在接下来的一段时间,和大家一起深入代码细节。利用原生的和,可以轻松地得到测试类中函数的。下期内容又被谁调用了呢运行的入口在哪里请看深入测试运行的入口

最近对JUnit和Mockito的内部实现比较感兴趣,将在接下来的一段时间,和大家一起深入代码细节。

王侯将相,宁有种乎 (JUnit也没啥Magic吧)

阅读前提

听说过Java Annotation

使用过JUnit

知道@Before, @After, @Test

对JUnit的内部实现有兴趣

代码版本: junit 4.12
代码搜索工具: http://grepcode.com/
常用符号

_: 用来略去代码段中无关紧要的parameter

...: 用来略去无关紧要的代码实现

Example

下面是一个很简单的JUunit Test Class

public class SampleTest {
   @Before
   protected void setUp(){ ... }

   @Test
   public void test1(){ ... }       
   
   @After
   public void tearDown(){ ... }
}

本文要解答的问题:@Before, @Test, @After如何影响test workflow的?

Q&A

Q1. 如何提取一个函数的Annotation信息?
A: 任何Java提供了Method::getDeclaredAnnotations()

Q2. 如何把SampleTest里的methods都罗列出来?
A: Java提供了Class::getDeclaredMethods()

Q3: @Before, @Test, @After的执行顺序如何保证的?
A: 在junit的BlockJUnit4ClassRunner class中有一段代码:

Statement statement = methodInvoker(method, _);
statement = withBefores(method, _, statement);
statement = withAfters(method, _, statement);

http://grepcode.com/file/repo1.maven.org...

Statement可以看做是一个函数封装(Functional Interface),内部只有一个execute()函数。method是被@Test修饰的测试函数(本例中的test1()),withBeforesSampleClass中被@Before修饰的所有函数找出来,然后封装成一个新的Statement

//比如说,可以用下面的naive实现
void withBefores(Method m, _, Statement statement) {
  // 利用Q1和Q2的知识点把@Before修饰的函数都找出来
  List befores = ...
  return new Statement{
    @Override
    public execute() {
      for (Method b : befores) {
        b.execute();
      }
      m.execute();
    }
  }
}

Q4: Q3中的BlockJUnit4ClassRunnerSampleTest搅合到一起的?
A: 请自己去看BlockJUnit4ClassRunner的constructor的parameter是什么。

Summary

利用Java原生的getDeclaredAnnotationsgetDeclaredMethods,可以轻松地得到测试类SampleTest中函数的annotations。

JUnit用一个Statement来做把setUp()test1(),以及tearDown()封装到一起,并保证其执行顺序。

References

Java Annotation
http://www.cnblogs.com/mandroid/archive/...

BlockJUnit4ClassRunner
http://grepcode.com/file/repo1.maven.org...

TestClass::getAnnotatedMethods() http://grepcode.com/file/repo1.maven.org...

下期内容

BlockJUnit4ClassRunner又被谁调用了呢?
运行unit test的入口在哪里?
请看:[深入JUnit] 测试运行的入口

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65652.html

相关文章

  • [深入JUnit] 测试运行入口

    摘要:剧透如果您看了深入的秘密,里面的是通过本文涉及到的,一个叫的类,与连接到一起的。是今天的主角比如说我们有一个类,如何调用来运行测试有一个的类,他的描述是所以,这个是运行测试的一个入口。接下来,打算转战倡导。 showImg(https://segmentfault.com/img/bVtSbH); 阅读前提 了解JUnit 对JUnit的内部实现有兴趣 不妨看看[深入JUnit] @...

    springDevBird 评论0 收藏0
  • [深入JUnit] 测试运行入口

    摘要:剧透如果您看了深入的秘密,里面的是通过本文涉及到的,一个叫的类,与连接到一起的。是今天的主角比如说我们有一个类,如何调用来运行测试有一个的类,他的描述是所以,这个是运行测试的一个入口。接下来,打算转战倡导。 showImg(https://segmentfault.com/img/bVtSbH); 阅读前提 了解JUnit 对JUnit的内部实现有兴趣 不妨看看[深入JUnit] @...

    godlong_X 评论0 收藏0
  • JUnit4 note

    摘要:步骤三为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。步骤五编写测试方法,使用定义的变量作为参数进行测试。 What is JUnit JUnit is a Regression Testing Framework used by developers to implement unit testing in Java and accelerate p...

    NicolasHe 评论0 收藏0
  • junit4备忘录

    摘要:它由和建立,逐渐成为源于的的家族中最为成功的一个。与添加进入的的依赖中。具有两个参数可选该测试方法允许执行的最大时间长度。单位捕获抛出的异常。这个类不包含任何方法更改入口类的测试运行器为将要运行的测试类作为数组传入到中。 简介 JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为...

    TZLLOG 评论0 收藏0
  • Java JUnit 单元测试小结

    摘要:一旦你完成了相应函数,只需要把注解删去,就可以进行正常的测试。表示该方法只执行一次,并且在所有方法之后执行。 测试类型 单元测试(Unit test) 单元测试关注单一的类. 它们存在的目的是检查这个类中的代码是否按照期望正确运行. 集成测试(Integration test) 顾名思义, 集成测试是检查开发的模块和其他模块整合时是否正常工作.虽然集成测试的代码影响范围比单元测试要广,...

    Rainie 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<