用匿名类实现Mock
终于发现Java的一个好处了,在Java中,除非你明确声明一个类或者方法是封闭的,否则就可以继承这个类并重载公开的方法,而在DotNet中正好相反,你必须明确的声明一个方法是virtual的才能被重载。谁没事给每个公开方法都去声明一个virtual啊?
Java的这个特性,在单元测试时就非常有用了,可以非常简单的实现一个Mock,而不需要引入所谓的JMock之类的第三方Mock包,而且对一般的单元测试而言,足够用了。
例如:我们要测试类的方法:
class A {
B objB;
public void foo() {
...
objB.fooB();
...
}
}
由于在 foo 中调用了 objB.fooB(),一般情况下,我们应该Mock这个方法以隔离 fooB。单元测试可以这样写:
public testFoo() {
A targert = new A();
targer.objB = new B() {
@override int fooB() {
return 0;
}
};
target.foo();
}
直接将声明一个匿名类继承 class B, 并重载 fooB() 方法即可。