2008-10-10 84 views
6

說我有一個如何用最終方法去嘲笑一個類?

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很酷還是什麼?

+0

從大小寫判斷,這必須是Java。 – jop 2008-10-10 09:14:05

+0

你能告訴我們你用什麼語言(看起來像java)?一些答案可能是語言依賴的,也可以告訴我們你使用的是什麼嘲笑框架 – Jean 2008-10-10 09:14:30

回答

6

你可以試試JMockit嘲笑庫。

+0

看起來很有趣,我會檢查出來,謝謝。 – Epaga 2008-10-10 09:20:46

0

我想刪除「最終」,只是在評論「不要重寫此方法!!」。如果你不能相信同事不遵循簡單的指示,反正無望。

+0

...除了我們不只是談論同事,因爲客戶可以使用我們的API ... – Epaga 2008-10-10 11:44:04

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()); 
    } 
}