然后再實(shí)現(xiàn)各個(gè)注解自定義Filter類,實(shí)現(xiàn)Filter的shouldRun方法定義, 以Sprint為例:
	/**
	* Filter rules for the annotation 
{@link Sprint}
	*
	* @author Carl Ji
	*
	*/
	public class FilterSprint extends Filter
	{
	private String tgValue = null;
	private Boolean _isOnly = false;
	public FilterSprint(String targetValue)
	{
	setTgValue(targetValue);
	}
	public FilterSprint(String targetValue, Boolean isOnly)
	{
	setTgValue(targetValue);
	_isOnly = isOnly;
	}
	public FilterSprint()
	{
	// TODO Auto-generated constructor stub
	}
	public Boolean getIsOnly()
	{
	return _isOnly;
	}
	public void setIsOnly(Boolean isOnly)
	{
	this._isOnly = isOnly;
	}
	public String getTgValue()
	{
	return tgValue;
	}
	public void setTgValue(String tgValue)
	{
	this.tgValue = tgValue;
	}
	@Override
	public boolean shouldRun(FrameworkMethod method)
	{
	Sprint aSprint = method.getAnnotation(Sprint.class);
	return filterRule(aSprint);
	}
	@Override
	public boolean shouldRun(Description description)
	{
	if(description.isTest())
	{
	Sprint aSprint = description.getAnnotation(Sprint.class);
	return filterRule(aSprint);
	}
	else
	{
	return true;
	}
	}
	@Override
	public String describe()
	{
	// TODO Auto-generated method stub
	return null;
	}
	// Implement of filter rule for Sprint Annotation
	private boolean filterRule(Sprint aSprint)
	{
	if(_isOnly)
	{
	if(aSprint != null && aSprint.value().equalsIgnoreCase(tgValue))
	{
	return true;
	}
	else
	{
	return false;
	}
	}
	else
	{
	if(aSprint == null)
	{
	return true;
	}
	else
	{
	if(0 >= new StringComparator().compare(aSprint.value(), tgValue))
	{
	return true;
	}
	}
	}
	return false;
	}
	  我這里多了個(gè)isOnly屬性,是為了解決歷史遺留的問(wèn)題。很多以前的Case并沒(méi)有我們加上新自定義的注解,那么可以通過(guò)這個(gè)屬性來(lái)定義這些Case要不要執(zhí)行。
	  當(dāng)然核心的Filter的方法,還是要看大家各自的需求,自行設(shè)定。
	  優(yōu)化,第二個(gè)解決辦法
	  上面的實(shí)現(xiàn)方法做了很多工作,比如你要擴(kuò)展JunitCore類,擴(kuò)展Request 類,擴(kuò)展RunnerBuilder類,還要擴(kuò)展BlockJunit4ClassRunner類,那么研究過(guò)JUnit源碼的童鞋可能知道,JUnit是提供入口讓我們?nèi)プ⑷隖ilter對(duì)象。具體是在ParentRunner類里的下面方法:
	//
	// Implementation of Filterable and Sortable
	//
	public void filter(Filter filter) throws NoTestsRemainException {
	for (Iterator<T> iter = getFilteredChildren().iterator(); iter.hasNext(); ) {
	T each = iter.next();
	if (shouldRun(filter, each)) {
	try {
	filter.apply(each);
	} catch (NoTestsRemainException e) {
	iter.remove();
	}
	} else {
	iter.remove();
	}
	}
	if (getFilteredChildren().isEmpty()) {
	throw new NoTestsRemainException();
	}
	}
	  那其實(shí)我們只要把我們自定義的Filter對(duì)象傳進(jìn)來(lái),我們的需求也實(shí)現(xiàn)了。
	public class FilterCollections extends Filter
	{
	List<Filter> filters = null;
	public FilterCollections(String intent)
	{
	try
	{
	filters = FilterFactory.createFilters(intent);
	}
	catch(ClassNotFoundException e)
	{
	e.printStackTrace();
	}
	}
	@Override
	public boolean shouldRun(Description description)
	{
	List<Boolean> result = new ArrayList<Boolean>();
	for(Filter filter : filters)
	{
	if(filter != null && filter.shouldRun(description))
	{
	result.add(true);
	}
	else
	{
	result.add(false);
	}
	}
	if(result.contains(false))
	{
	return false;
	}
	else
	{
	return true;
	}
	}