Java 线程测试框架

《Java编程思想》中的测试框架整理: 
1、首先定义个一接口,仅用此接口表示在代码中提供有意义的名字,表示状态。

package com.jereh;

public interface InvariantState {}

2、定义两种状态类,表示成功或者失败,失败类对象包括一个对象,该对象表示有关失败的原因信息,这样一般是为了把这种信息显示出来。

package com.jereh;

public class InvariantOK implements InvariantState{}
package com.jereh;

public class InvariantFailure implements InvariantState{

    public Object value;

    public InvariantFailure(Object value){
        this.value = value;
    }
}

3.定义一个接口,任何需要对约束条件进行测试的类都必须实现这个接口:

package com.jereh;

public interface Invariant {    
    InvariantState invariant();
}

4.定义一个类并继承Timer,如果不出现异常状况则一段时间后自动结束程序:

package com.jereh;

import java.util.Timer;
import java.util.TimerTask;

public class Timeout extends Timer{

    public Timeout(int delay,final String msg){
        super(true);
        schedule(new TimerTask(){
            public void run(){
                System.out.println(msg);
                System.exit(0);
            }
        },delay);
    }
}

5.定义一个线程,使用Invariant接口和Timeout类,用来当作观察者:

package com.jereh;

public class InvariantWatcher extends Thread{
    private Invariant invariant;
    public InvariantWatcher(Invariant invariant){
        this.invariant = invariant;
        setDaemon(true);
        start();
    }

    public InvariantWatcher(Invariant invariant, final int timeOut){
        this(invariant);
        new Timeout(timeOut,"Timed out without violating invariant");
    }

    public void run(){
        while(true){
            InvariantState state = invariant.invariant();
            if(state instanceof InvariantFailure){
                System.out.println("Invariant violated:"+((InvariantFailure)state).value);
                System.exit(0);
            }
        }
    }
}

6.测试一下类,将观察者放入要测试的目标类中:

package com.jereh;

public class EvenGenerator implements Invariant{

    private int i ;

    public void next(){ i++; i++; }

    public int getValue(){ return i; }

    @Override
    public InvariantState invariant() {

        int val = i;
        if( val%2 == 0){
            return new InvariantOK();
        }else{
            return new InvariantFailure(new Integer(val));
        }
    }

    public static void main(String[] args){

        EvenGenerator gen = new EvenGenerator();
        new InvariantWatcher(gen);
        while(true)
            gen.next();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值