阅读更多

4顶
0踩

编程语言

原创新闻 JDave - Java的行为驱动编程框架

2007-11-21 21:28 by 见习编辑 robbin 评论(4) 有30239人浏览
BDD,即行为驱动编程,是TDD的一个改进版本,BDD本质上也是TDD,但是比TDD要更加自然一些,更DSL化,通过定义一个一个具体可执行的Behavior来驱动软件的开发过程。如果你是一个Ruby程序员的话,那么你一定会发现RSpec已经提供了良好的BDD编程框架。我们正在开发当中的JavaEye3.0网站就是使用了rspec来编写系统的behavior,来驱动编程和单元测试。

不过如果你是一个Java程序员,那么你现在不需要再羡慕Ruby程序员了,因为JDave已经提供了类似rspec的功能。JDave同时也集成了JMock库作为mock实现,下面我们看一个简单的例子:

import jdave.Block;
import jdave.Specification;
import jdave.junit4.JDaveRunner;

@RunWith(JDaveRunner.class)
public class StackSpec extends Specification<Stack<?>> {
    public class EmptyStack {
        private Stack<String> stack;

        public Stack<String> create() {
            stack = new Stack<String>();
            return stack;
        }

        public void isEmpty() {
            specify(stack, must.be.empty());
        }

        public void isNoLongerEmptyAfterPush() {
            stack.push("anything");
            specify(stack, must.not().be.empty());
        }
    }

    public class FullStack {
        private Stack<Integer> stack;

        public Stack<Integer> create() {
            stack = new Stack<Integer>(10);
            for (int i = 0; i < 10; i++) {
                stack.push(i);
            }
            return stack;
        }

        public void isFull() {
            specify(stack, must.be.full());
        }

        public void complainsOnPush() {
            specify(new Block() {
                public void run() throws Throwable {
                    stack.push(100);
                }
            }, should.raise(StackOverflowException.class));
        }
        
        public void containsAllItems() {
            for (int i = 0; i < 10; i++) {
                specify(stack, contains(i));
            }
        }
        
        public void doesNotContainRemovedItem() {
            stack.remove(3);
            specify(stack, does.not().contain(3));
        }
        
        public void containsAllButRemovedItem() {
            stack.remove(3);
            specify(stack, containsExactly(0, 1, 2, 4, 5, 6, 7, 8, 9));
        }
    }

    public class StackWhichIsNeitherEmptyNorFull {
        private Stack<Integer> stack;

        public Stack<Integer> create() {
            stack = new Stack<Integer>();
            for (int i = 0; i < 10; i++) {
                stack.push(i);
            }
            return stack;
        }

        public void addsToTheTopWhenSentPush() {
            stack.push(100);
            specify(stack.peek(), must.equal(100));
        }
    }
}


每个方法实际上也是单元测试,但是并不是使用junit习惯的assert方法,而是specify,断言使用的是mast,containsExactly,should等比较口语化的方法名称。

JDave是一个非常好的尝试,对于不喜欢assert风格的用户不妨尝试尝试,从我们rspec的使用经验来看,写BDD的example要比写TDD的test更加自然一些。

JDave主页:

http://www.jdave.org/
4
0
评论 共 4 条 请登录后发表评论
4 楼 liyun_1981 2009-12-03 16:48
行为驱动倒是自然得好,有时间看看Specification类的源代码,感觉蛮和我口味的,呵呵。
3 楼 Jekey 2007-11-27 10:03
看到assert就郁闷啊,我们还都一直用java1.4版本呢
2 楼 pf_miles 2007-11-22 11:02
....
不好意思,记错了,套里面是可以的...
1 楼 pf_miles 2007-11-22 10:58
看了吓一跳...public class里面套public class能编译通过么?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics