摘要:最近对和的内部实现比较感兴趣,将在接下来的一段时间,和大家一起深入代码细节。利用原生的和,可以轻松地得到测试类中函数的。下期内容又被谁调用了呢运行的入口在哪里请看深入测试运行的入口
最近对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&AQ1. 如何提取一个函数的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()),withBefores把SampleClass中被@Before修饰的所有函数找出来,然后封装成一个新的Statement。
//比如说,可以用下面的naive实现 void withBefores(Method m, _, Statement statement) { // 利用Q1和Q2的知识点把@Before修饰的函数都找出来 Listbefores = ... return new Statement{ @Override public execute() { for (Method b : befores) { b.execute(); } m.execute(); } } }
Q4: Q3中的BlockJUnit4ClassRunner和SampleTest搅合到一起的?
A: 请自己去看BlockJUnit4ClassRunner的constructor的parameter是什么。
利用Java原生的getDeclaredAnnotations和getDeclaredMethods,可以轻松地得到测试类SampleTest中函数的annotations。
JUnit用一个Statement来做把setUp(),test1(),以及tearDown()封装到一起,并保证其执行顺序。
ReferencesJava 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
摘要:剧透如果您看了深入的秘密,里面的是通过本文涉及到的,一个叫的类,与连接到一起的。是今天的主角比如说我们有一个类,如何调用来运行测试有一个的类,他的描述是所以,这个是运行测试的一个入口。接下来,打算转战倡导。 showImg(https://segmentfault.com/img/bVtSbH); 阅读前提 了解JUnit 对JUnit的内部实现有兴趣 不妨看看[深入JUnit] @...
摘要:剧透如果您看了深入的秘密,里面的是通过本文涉及到的,一个叫的类,与连接到一起的。是今天的主角比如说我们有一个类,如何调用来运行测试有一个的类,他的描述是所以,这个是运行测试的一个入口。接下来,打算转战倡导。 showImg(https://segmentfault.com/img/bVtSbH); 阅读前提 了解JUnit 对JUnit的内部实现有兴趣 不妨看看[深入JUnit] @...
摘要:步骤三为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。步骤五编写测试方法,使用定义的变量作为参数进行测试。 What is JUnit JUnit is a Regression Testing Framework used by developers to implement unit testing in Java and accelerate p...
摘要:一旦你完成了相应函数,只需要把注解删去,就可以进行正常的测试。表示该方法只执行一次,并且在所有方法之后执行。 测试类型 单元测试(Unit test) 单元测试关注单一的类. 它们存在的目的是检查这个类中的代码是否按照期望正确运行. 集成测试(Integration test) 顾名思义, 集成测试是检查开发的模块和其他模块整合时是否正常工作.虽然集成测试的代码影响范围比单元测试要广,...
阅读 3665·2021-11-25 09:43
阅读 2614·2021-11-25 09:43
阅读 3777·2021-11-24 09:38
阅读 655·2021-11-18 10:02
阅读 2190·2021-09-22 15:53
阅读 2973·2019-08-30 15:44
阅读 2746·2019-08-30 14:01
阅读 2695·2019-08-29 15:15