说我有A级
class A {
final String foo() {
// .. computing result, contacting database, whatever ..
return "some computed value";
}
// ... and a bazillion other methods, some of them final.
}
现在我有了B级
class B {
String methodIWantToTest(A a) {
String output = a.foo();
// ... whatever this method does, e.g.:
output += "_suffix";
return output;
}
}
我如何进行单元测试此方法? foo()
最终的原因是因为我们不希望扩展A的类改变其功能。但同时要对方法进行真正的单元测试,我不希望它伸出并运行实际的A.foo()
方法。
是否可以删除最终关键字并在@finalUnlessTest
行添加注释?你会推荐什么?重构A到一个接口将是非常非常困难的,看它是如何它是我们的中心类之一,并且不幸的是漂亮非常耦合。
编辑#1 抱歉,忘记提及,我们正在谈论Java。我们现在还没有使用模拟框架。
回答好的,所以:哇。 JMockit令人难以置信,在我看来是用于测试遗留代码的杀手级应用。特别是在我的情况下,令人难以置信的有用。非常感谢!对于我的psuedo-example,你基本上会做类似的事情:
class AMock {
final String foo() {
return "myTestValue";
}
}
class Test extends TestCase {
A mockedA;
B b;
protected void setUp() {
Mockit.redefineMethods( A.class, AMock.class ); // this "pipes" all mocked methods from A to AMock
mockedA = new A(); // NOT new AMock()!!!
b = new B();
}
public void testB() {
assertEquals("myTestValue",mockedA.foo());
assertEquals("myTestValue_suffix",b.methodIWantToTest(mockedA));
}
}
这个frickin'酷还是什么?
答案 0 :(得分:6)
您可以尝试使用JMockit模拟库。
答案 1 :(得分:0)
我会删除“最终”并只是发表评论“不要覆盖此方法!!”。如果你不能相信同事不遵循简单的指示,那么无论如何都无望。
答案 2 :(得分:0)
以下代码也允许您这样做。我并不是说这是一种很好的做法,但它是一种有趣的使用(滥用?)匿名类。
public class Jobber {
public final String foo() {
return fooFactory() ;
}
String fooFactory() {
return "jobber" ;
}
public static void main(String[] args) {
Jobber jobber = new Jobber() { String fooFactory() { return "prefix " + super.fooFactory() ;} } ;
System.out.println(jobber.foo() );
}
}