說我有一個如何用最終方法去嘲笑一個類?
class A {
final String foo() {
// .. computing result, contacting database, whatever ..
return "some computed value";
}
// ... and a bazillion other methods, some of them final.
}
現在我有
class B {
String methodIWantToTest(A a) {
String output = a.foo();
// ... whatever this method does, e.g.:
output += "_suffix";
return output;
}
}
B類我怎麼會去的單元測試這種方法的A類? foo()
是最終的原因是因爲我們不希望我們的擴展A的類改變它的功能。但同時要真正對單元測試方法進行單元測試,我不希望它觸及並運行實際的A.foo()
方法。
有沒有辦法去刪除最後一個關鍵字,並添加註釋沿@finalUnlessTest
?你會推薦什麼?重構A到一個接口將是非常非常困難的,因爲它是我們的中心類之一,並且不幸的是漂亮的非常耦合。
編輯#1對不起,忘了提及,我們正在談論Java。至今我們還沒有使用模擬框架。
答案好吧,那麼:哇。 JMockit是令人難以置信的,在我眼中是測試遺留代碼的殺手級應用程序。特別在我的情況下非常有用。非常感謝!你基本上會做我喜歡的例子,如下所示:
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很酷還是什麼?
從大小寫判斷,這必須是Java。 – jop 2008-10-10 09:14:05
你能告訴我們你用什麼語言(看起來像java)?一些答案可能是語言依賴的,也可以告訴我們你使用的是什麼嘲笑框架 – Jean 2008-10-10 09:14:30