junit源码之设计模式

       我们做需求时候经常用junit单元测试,由于junit是一个Java测试框架,通过maven依赖直接就可以看到对应的源码,
今天在看源码的时候发现用到了好多设计模式,我们平常不仅要看懂源码,还要理解设计理念,设计思想,其中用到的设计模式有
命令模式,组合模式,模板方法模式,观察者模式,装饰器模式。

包结构如下
junit源码之设计模式_第1张图片

类图

3总结

对于Junit源码的设计模式的解释,网上一堆,但是只有自己亲自造个轮子才能更深刻理解当中的奥妙!!!

下面的一部分参考 https://blog.csdn.net/u014534808/article/details/79626819
1. Test接口之命令模式 
作为辅助用户进行单元测试的框架。开发人员在使用它时,仅仅关心的是测试用例的编写。junit只是一个测试用例的执行器和结果查看器,不需要太多的关注框架的细节。对junit来说,它并不需要知道请求TestCase的操作信息。仅把它当作一种命令测试结果发给开发人员,命令模式正是为了达到这种松耦合的目的的。 代码如下

public abstract class Command {
    public abstract void execute();  
}
public class CommandManager {
    private static Map map = new HashMap();  
    
    static {  
        map.put("startup", new StartupCommand());  
        map.put("shutdown", new ShutdownCommand());  
    }  
     
    public static void executeCommand(String cmd) {  
        Command command = map.get(cmd);  
        if (null != command) {  
            command.execute();  
        } else {  
            System.out.println("no have this command, warn!!!");  
        }  
    }  
}
public class ShutdownCommand extends Command {
    @Override  
    public void execute() {  
        System.out.println("shutdown system");  
    }  
}
public class StartupCommand  extends Command {
    @Override  
    public void execute() {  
        System.out.println("startup system");  
    }  
}
/**
 * 
 * @ClassName: TestCommand
 * @Description: TODO
 * @author: 19.命令模式(Command)
以物件来代表实际行动,命令物件可以把行动及其参数封装起来。
 * @date: 2016年4月17日 下午1:44:26
 *
 */
public class TestCommand {
    public static void main(String[] args) {  
        CommandManager.executeCommand("go");  
        CommandManager.executeCommand("startup");  
    }  
}


2. TestSuite组合模式 
当系统的测试用例慢慢变多是,逐个运行测试用例就成了一个棘手的问题。作为一个方便使用的测试框架。在junit里面提供了TestSuite的功能,它允许将多个测试用例放在一个TestSuite里面一次执行。而且要进一步的支持在TestSuite中嵌套TestSuite的功能,使用组合模式能够很好的解决这个问题。
3. TestCase模板方法模式 
junit在TestCase这个抽象类中将整个测试的流程设置好了,比如先执行setUp方法初始化测试前提,再运行测试方法,然后再TearDown来取消测试设置。这些具体的实现都是在子类中去实现的。 典型的如下代码

/**
 * @version 1.00
 * @time 2019-08-19 15:36
 */
public abstract class TemplateTest {

    public abstract void begin();

    public abstract void end();

    public void doSomething(){
        begin();
        dealSomething();
        end();
    }
    public void dealSomething(){
        System.out.println("real begin do");
    }


}


4. TestResult之观察者模式 
junit还用到了观察者模式,TestResult是观察者模式中的主题角色,每个TestCase运行的时候都是用TestResult来运行的,这样才能通知每个观察者方法要开始运行了,在这里,观察者就是那些显示方法。比如Text,Swing,Awt那几种,也就是红绿条和文本显示。
4. TestResult之装饰器模式 
 在执行run方法的前后执行startTest和endTest,装饰下run方法的行为

你可能感兴趣的:(Java)