说我有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()
是final是因为我们不希望扩展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'酷还是什么?
您可以尝试使用JMockit模拟库.