在学习JUnit的过程中,我自己会有一些疑问。
1)什么样的方法会被JUnit监测执行?
上面,我们定义了2个带Test注解的方法,所以会被执行,那么,到底什么样的方法才会被JUnit执行呢?
private Collection<T> getFilteredChildren() {
System.out.println("before filteredChildren --- > "+filteredChildren);
if (filteredChildren == null) {
synchronized (childrenLock) {
if (filteredChildren == null) {
//这一行获取需要执行的函数
filteredChildren = Collections.unmodifiableCollection(getChildren());
}
}
}
System.out.println("after filteredChildren --- > "+filteredChildren);
return filteredChildren;
}
我们进入getChildren()看看
@Override
protected List<FrameworkMethod> getChildren() {
System.out.println("getChildren *** is invoked");
return computeTestMethods();
}
这个函数的位置是
Breakpoint hit: "thread=main", org.junit.runners.BlockJUnit4ClassRunner.getChildren(), line=106 bci=0
106 return computeTestMethods();
main[1] where
[1] org.junit.runners.BlockJUnit4ClassRunner.getChildren (BlockJUnit4ClassRunner.java:106)
[2] org.junit.runners.ParentRunner.getFilteredChildren (ParentRunner.java:426)
[3] org.junit.runners.ParentRunner.getDescription (ParentRunner.java:351)
[4] org.junit.runners.Suite.describeChild (Suite.java:123)
[5] org.junit.runners.Suite.describeChild (Suite.java:1)
[6] org.junit.runners.ParentRunner.getDescription (ParentRunner.java:352)
[7] org.junit.runner.JUnitCore.run (JUnitCore.java:136)
[8] org.junit.runner.JUnitCore.run (JUnitCore.java:115)
[9] org.junit.runner.JUnitCore.runMain (JUnitCore.java:77)
[10] org.junit.runner.JUnitCore.main (JUnitCore.java:36)
/**
* Returns the methods that run tests. Default implementation returns all
* methods annotated with {@code @Test} on this class and superclasses that
* are not overridden.
*/
protected List<FrameworkMethod> computeTestMethods() {
return getTestClass().getAnnotatedMethods(Test.class);
}
注意!!!,这里的Test.class就是我们的可爱的注解先生:
org.junit.Test
@Retention(value=RUNTIME)
@Target(value={METHOD})
/**
* Returns, efficiently, all the non-overridden methods in this class and
* its superclasses that are annotated with {@code annotationClass}.
*/
public List<FrameworkMethod> getAnnotatedMethods(Class<? extends Annotation> annotationClass) {
return Collections.unmodifiableList(getAnnotatedMembers(methodsForAnnotations, annotationClass, false));
}
结论:标记了org.junit.Test的注解的方法会被框架监控执行
2)如果定义多个JUnit测试方法,实例会被产生多次还是1次?
我的测试类代码为:
package mytest;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorTest {
public CalculatorTest(){
System.out.println("CalculatorTest generated...--->"+this);
}
@Test
public void evaluatesExpression() {
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
System.out.println("sum is ---> "+sum);
}
@Test
public void evaluatesExpression1() {
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
System.out.println("sum is ---> "+sum);
}
}
打印结果为:
CalculatorTest generated...--->mytest.CalculatorTest@7a81197d
sum is ---> 6
CalculatorTest generated...--->mytest.CalculatorTest@5ca881b5
sum is ---> 6
显然,这里触发了2次,
结论: 每个方法执行时,都会导致重新生成一个实例。
根据我之前的研究,我对JUnit的理解如下:
后面如果有更深刻的理解,再更新!