`
sing100star
  • 浏览: 28957 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

发一个在学习Junit3.81源码时的小demo

阅读更多

    此代码,是在阅读unit3.81源码时写的,虽然有些粗糙,但是可以理解junit的设计思想:)

    一、类得基本介绍

         1、command包

             a、command,抽象命令类

             b、SingleCommand,单一命令

             c、CommandSuite,复杂命令

             d、RepeatedCommand,可以重估执行多次命令,装饰类

             e、PauseCommand,暂停一段时候后,执行命令,装饰类

        2、person包

             a、Person ,描述人人可以执行的动作

             b、BackwardCommand,后退命令

             c、SitDownCommand,坐下命令

             d、WalkCommand,前进命令

        3、其他

             a、CommandListener,通知命令的执行结果

             b、ComandResult,观察命令的执行情况,并把情况告诉CommandListner

             c、FailCommandException,命令执行失败异常类

    二、相关说明

        1、command是命令模式、装饰器模式、组合模式的核心

        2、CommandResult,用来观察command的执行结果,用到模板模式

        3、CommandListener。命令执行结果的输出地,只要实现Listener,可以输出到屏幕,txt,数据库

        4、这些都可以在junit找到影子:)

    三、相关代码

/** 命名类,核心中的核心 */
public interface Command {
    public void exec(CommandResult result) ;
}

 

/**复合命令 */
public class CommandSuite  implements Command {
    private List<Command> commands = new LinkedList<Command>();
    public void addCommand(Command c){
        commands.add(c);
    }
    public void exec(CommandResult result){
         for(Command c:commands){
            c.exec(result);
         }
    }
}

 

/**单一命令 */
public interface SingleCommand extends Command {
    public void doCommand() throws FailedCommandException;
    public Person getPerson();
}

 

/**装饰器类,暂时5s,再执行 */
public class PauseCommand implements Command {
    private Command c;
    public PauseCommand(Command c){
        this.c = c;
    }
    public void baseExec(CommandResult result) {
        c.exec(result);
    }
    public void exec(CommandResult r){
        System.out.println("暂停5s!");
        baseExec(r);
    }
}

 

/**重复十次 */
public class RepeatedCommand implements Command {
    private Command c;
    public RepeatedCommand(Command c){
        this.c = c;
    }
    public void baseExec(CommandResult result) {
        c.exec(result);
    }
    public void exec(CommandResult r){
        System.out.println("重复10次!");
        for(int i = 0 ;i < 10;i++){
            baseExec(r);
        }
    }
}

 

/** 人的各种行为 */
public class Person  {
    private String  name;
    public Person(String name){
        this.name = name  ;
    }
    public Person() {
    }
    public void walk() throws FailedCommandException {
        int a = new Random().nextInt() % 2;
        if(a == 0 ){
            throw new FailedCommandException(name+",拒绝命令");
        }
        System.out.println(name+",前进!");
    }
    public void sitDown() throws  FailedCommandException{
       int a = new Random().nextInt() % 2;
        if(a == 0 ){
            throw new FailedCommandException(name+",拒绝命令");
        }
        System.out.println(name+",坐下");
    }
    public void backward() throws FailedCommandException{
        int a = new Random().nextInt() % 2;
        if(a == 0 ){
            throw new FailedCommandException(name+",拒绝命令");
        }
        System.out.println(name+",后退");
    }
    public String getName() {
        return name;
    }
}

/**后退命令*/
public class BackwardCommand implements SingleCommand {
    private Person p;
    public BackwardCommand(Person p){
        this.p = p;
    }
    public void exec(CommandResult result) {
       result.doCommand(this);
    }
    public void doCommand() throws FailedCommandException {
        p.backward();
    }
    public Person getPerson() {
        return p;
    }
}
/**坐下命令 */
public class SitDownCommand implements SingleCommand {
    private Person p;
    public SitDownCommand(Person p){
        this.p = p;
    }
    public void exec(CommandResult result){
       result.doCommand(this);
    }
    public void doCommand() throws FailedCommandException {
        p.sitDown();
    }
    public Person getPerson() {
        return p;
    }
}

/** 前进命令*/
public class WalkCommand implements SingleCommand {
    private Person p;
    public WalkCommand(Person p){
        this.p = p;
    }
    public void exec(CommandResult result) {
        result.doCommand(this);
    }
    public void doCommand() throws FailedCommandException {
        p.walk();
    }
    public Person getPerson() {
        return p;
    }
}

 

/**本来要先写个接口,再写个实现类,但在这里采用简单一点方式实现 */
public class CommandListener {
    public void onAddFailureCommand(SingleCommand c,Throwable e){
        System.out.println(e.getMessage());
    }
    public void onAddSuccessCommand(SingleCommand c){
        System.out.println(c.getPerson().getName()+"得到小红花");
    }
}

 

public class CommandResult {
    int failureCommands = 0;
    int successCommands = 0;
    CommandListener cl =new CommandListener();

    public void fireSuccessCommand(SingleCommand c){
        cl.onAddSuccessCommand(c);
    }
    public void fireFailedCommand(SingleCommand c,Throwable t){
        cl.onAddFailureCommand(c,t);
    }
    public void doCommand(SingleCommand c){
        try {
            c.doCommand();
            successCommands++;
            fireSuccessCommand(c);
        } catch (FailedCommandException e) {
           failureCommands++;
           fireFailedCommand(c,e);
           return;
        }

    }
    public int getFailureCommands() {
        return failureCommands;
    }
    public int getSuccessCommands() {
        return successCommands;
    }
}

 

public class MainTest {
    public static void main(String[] args){
        Person zhangSan =new Person("张三");
        Command c1 = new SitDownCommand(zhangSan);
        Command c2 = new WalkCommand(zhangSan);
        Command c3 = new BackwardCommand(zhangSan);
        CommandSuite cs =new CommandSuite();
        cs.addCommand(c1);
        cs.addCommand(c2);
        cs.addCommand(c3);
        cs.addCommand(c2);
        cs.addCommand(c1);
        cs.addCommand(c2);
        cs.addCommand(c3);
        cs.addCommand(c2);
        cs.addCommand(c1);
        cs.addCommand(c2);
        cs.addCommand(c3);
        cs.addCommand(c2);
        cs.addCommand(c1);
        cs.addCommand(c2);
        cs.addCommand(c3);
        cs.addCommand(new PauseCommand(c2));
        cs.addCommand(c3);
        cs.addCommand(new RepeatedCommand(c2));
        CommandResult cr =new CommandResult();
        PauseCommand cc = new PauseCommand(cs) ;
        cc.exec(cr);
        System.out.println("failure:"+cr.getFailureCommands());
        System.out.println("success:"+cr.getSuccessCommands());
    }
}

 

分享到:
评论

相关推荐

    junit3.81 src

    首先,JUnit 3.8.1是JUnit系列的一个重要版本,它在继承前一版本的基础上,进行了许多优化和改进,以满足开发者的测试需求。在这个版本中,我们可以看到JUnit的核心设计理念:简洁、可扩展和易于使用。这些理念贯穿...

    junit测试小demo

    - `@Test`: 表明这是一个测试方法,Junit会在运行时自动调用这个方法。 - `@Before`和`@After`: 分别在每个测试方法之前和之后执行,常用于环境的初始化和清理。 - `@BeforeClass`和`@AfterClass`: 在整个测试类...

    junit 的源码jar包

    junit 的源码jar包 junit 的源码jar包 junit 的源码jar包

    Junit4完整源码

    JUnit4 是一个广泛使用的Java编程语言的单元测试框架。它为开发者提供了一种方便的方式来编写和执行可重复的、自动化的测试用例,确保代码的质量和功能稳定性。JUnit4源码的完整版本包含了整个框架的实现细节,对于...

    junit4 单元测试源码

    Eclipse开发环境是一个流行的Java集成开发环境,它支持JUnit插件,使得在Eclipse中编写和运行JUnit测试变得直观和便捷。 在Eclipse中使用JUnit4进行单元测试,首先需要安装JUnit库到项目中,并配置构建路径。然后,...

    Junit Recipes 源码

    5. **JUnitX Examples**: JUnitX可能是JUnit的一个扩展或变体,这部分源码提供了使用该扩展进行测试的例子。 6. **CoffeeShopApplication**: 这可能是整个咖啡店应用的主项目,包含业务逻辑、数据访问、用户界面等...

    JUnit4.8.1源码包

    JUnit4.8.1源码包 版本4.8.1 只有源码。

    junit源码以及牵涉到的设计模式

    例如,在JUnit中,`run`方法可以被看作是一个命令,它负责执行一个测试案例,而不需要关心具体的测试结果如何处理。 ##### 2. Composite 模式 Composite模式(组合模式)用于构建树形结构,以便表示“部分-整体”...

    junit in action 源码

    例如,@Test注解标记的是一个测试方法,@Before和@After则分别用于在每个测试方法执行前后的准备工作和清理工作。 2. **测试执行**:JUnit使用测试运行器(Test Runner)来执行测试。默认的JUnit4测试运行器是...

    junit-demo-源码.rar

    1. 测试结构:打开`junit-demo-源码.zip`,我们可以看到一个典型的JUnit测试项目结构,包含测试类和被测试类。测试类通常位于`src/test/java`目录下,被测试类位于`src/main/java`。 2. 测试用例:源码中的每个测试...

    自定义junit源码

    自定义JUnit源码是一个对Java开发人员非常有帮助的主题,特别是对于那些想要深入理解测试框架工作原理或希望根据自身需求定制测试工具的开发者。JUnit是一个广泛使用的单元测试框架,它简化了编写和运行针对Java代码...

    Junit源码分析(圣思园)

    **Junit源码分析(圣思园)** Junit是Java编程语言中最广泛使用的单元测试框架,它使得开发者能够...阅读和学习Junit源码不仅能够帮助我们写出更健壮的测试用例,也能够提高我们的编程技能,理解测试框架背后的原理。

    junit实例demo

    在"sampleproject"中,我们可以看到一个实际的JUnit测试项目的结构,包括测试类、测试方法以及可能的配置文件。通过这个实例,你可以学习如何组织和编写JUnit测试,以及如何通过IDE(如IntelliJ IDEA或Eclipse)运行...

    junit4测试源码

    最后,"testJunit4"这个文件名可能是一个包含JUnit4测试用例的Java类或测试项目,其中可能包含了一系列的测试方法,用于验证特定功能的正确性。通过分析和运行这些测试用例,我们可以了解如何编写有效的JUnit4测试,...

    Junit4单元测试源码

    JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的...

    android studio junit测试 demo

    `ActivityTestRule`是一个JUnit规则,它会在每个测试方法之前启动Activity并在结束后销毁它,提供了一个方便的测试环境。 在Android Studio中,你可以通过点击顶部菜单的`Run &gt; Run 'MainActivityTest'`来执行测试...

    junit4.12源码

    junit4.12源码,便于查看源码,重写方法,为己所用。

    JUnit+Ant+Jacoco整合 简单的Demo源码

    本资源是一个关于JUnit、Ant构建工具和Jacoco代码覆盖率工具整合的简单Demo,非常适合初学者了解和实践这三个工具的集成使用。 首先,JUnit是Java开发中的测试框架,它允许开发者编写针对单个方法的测试用例。JUnit...

    在线学习网站DEMO源码(JAVA 毕业设计 J2EE)

    在线学习网站DEMO源码基于JAVA技术和J2EE框架,为开发者提供了一个完整的在线教育平台的实例。这个项目是JAVA毕业设计的一部分,旨在帮助学生理解并实践企业级应用的开发流程,同时也适合进行课程设计或者技术研究。...

    Springboot-junit项目源码

    通过分析"Springboot-junit"项目源码,我们可以学习如何在SpringBoot项目中有效地进行测试,理解SpringBoot与JUnit的协同工作原理,以及如何利用Mockito进行模拟测试。这对于提升项目的质量和可维护性至关重要。

Global site tag (gtag.js) - Google Analytics