JUnit4.8.2源代码分析-6.1 排序和过滤
Runner.sort、Request.sortWith和Sorter.applyyqj2065都快被它们搞死了。Sorter.apply()、Request.sortWith()和Sortable.sort()三者做一件事情?为什么呢?java.util.Comparator接口是一个策略类,定义了int compare(T o1, T o2)方法。org.jun
[2015.10补充]Sorter.apply()、Request.sortWith()和Sortable.sort()三者的确做一件事情,从不同的起点出发,注入真正排序器。读源代码时比较难受——在若干类中跑来跑去,又不熟悉它们;看多了,还好。
Runner.sort、Request.sortWith和Sorter.apply
yqj2065都快被它们搞死了。
Sorter.apply()、Request.sortWith()和Sortable.sort()三者做一件事情?为什么呢?
java.util.Comparator接口是一个策略类,定义了int compare(T o1, T o2)方法。org.junit.runner.manipulation.Sorter implements Comparator<Description>,但是Sorter仅仅是形式上的实现类。它采用代理模式,底层有一个真正的、需要构造器注入的排序器Comparator<Description> fComparator。用户通常自定义一个排序器并注入。
而且@Override public intcompare(Description o1, Description o2)以实际排序器的返回作为返回。
真正不懂的是Sorter的方法apply,这个什么时候才有用?(注:SortingRequest中用了一下)
publicvoid apply(Object object) {
if(object instanceof Sortable) {
Sortablesortable = (Sortable) object;
sortable.sort(this);
}
}
接口Sortable,一个注入接口(依赖注入的一种),定义的唯一的方法public void sort(Sortersorter)。而Sortable是一些Runner的父接口,也就是说,Sortable对象是具有排序方式运行测试的Runner。按照我目前的直观感觉,Sortable.sort(Sorter)不如叫Sortable.setSorter(Sorter),某些Runner如ParentRunner
3. Request.sortWith()
Request有方法:
publicRequest sortWith(Comparator<Description> comparator) {
returnnew SortingRequest(this, comparator);
}
将this和某个自定义排序器注入,当SortingRequest.getRunner()时,对于原Request对象获得的runner,应用了
new Sorter(comparator).apply(runner);所以,Sorter.apply()、Request.sortWith()和Sortable.sort()三者做一件事情,从不同的起点出发,注入真正排序器。
现在有实际排序器:
package myTest.sort;
import java.util.Comparator;
import org.junit.runner.Description;
public class AlphabetComparator implements Comparator<Description> {
@Override
public int compare(Description d1, Description d2) {
return d1.getMethodName().compareTo(d2.getMethodName());
}
有测试目标
package myTest.sort;
import static tool.Print.*;
import org.junit.*;//Test/Ignore
public class Unit4{
@Test public void a() { pln("a() method executed."); }
@Test @Ignore public void b() { pln("b() method executed."); }
@Test public void c() { pln("c() method executed.");
throw new RuntimeException("Throw delibrately");
}
@Test public void f() { pln("f() method executed."); }
}
然后呢?茴香豆的茴有3种写法?在不同场合使用。
package myTest.sort;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;
import org.junit.runner.notification.*;
import org.junit.runner.*;
import org.junit.runner.manipulation.Sorter;
public class SortDemo {
public static void t1() {
BlockJUnit4ClassRunner runner=null ;
try {
runner= new BlockJUnit4ClassRunner(Unit4.class);
//runner.filter(new MethodNameFilter("testFilteredOut"));
} catch (InitializationError e) { }
runner.sort(new Sorter(new AlphabetComparator()));
runner.run(new RunNotifier());
}
public static void t2() {
Request request = Request.aClass( Unit4.class );
request = request.sortWith(new AlphabetComparator());
Runner runner = request.getRunner();
runner.run(new RunNotifier());
}
public static void t3() {
Request request = Request.aClass( Unit4.class );
Runner runner = request.getRunner();
Sorter sorter=new Sorter(new AlphabetComparator());
sorter.apply(runner);
runner.run(new RunNotifier());
}
public static void go(){t1() ;t2() ;t3(); }
}
ok
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)