JUnit的QA汇总

在学习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的理解如下:

后面如果有更深刻的理解,再更新!

 

转载于:https://my.oschina.net/qiangzigege/blog/830098

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值