2012-03-14 68 views
0

我目前使用的EasyMock像這樣創建模擬對象,而框架

mockedObject = createMock(myInterface.class); 

簡易模擬創建模擬對象是不必要的開銷(因爲我嘲笑的方法是非常簡單的),我想創建一個沒有它的模擬。

但問題是myInterface是一個接口,所以我如何實例化它。請建議。

感謝, 斯利拉姆

回答

3

最簡單的方法是創建一個實現接口的內部類,實現返回所需數據的方法,然後在測試用例中使用它。

例如:

public void testMethod () 
{ 
    MyInterface mockObject = new MyInterface () { 
     public void myMethod () 
     { 
      // NOOP 
     } 

     public int myFunction () 
     { 
      return -1 ; 
     } 
    } 

    // Proceed with the test case using mockObject 
} 
+0

創建一個內部類是一個很好的做法,只是好奇嗎? – sriram 2012-03-14 20:06:14

+2

這取決於你是否會再次重用該類的特定實現。就我而言,許​​多模擬對象是作爲匿名內部類開始的,當我開始重用它們時,發現自己被提升爲完整的飛行類。 – 2012-03-14 20:07:44

+0

匕首。非常感謝! – sriram 2012-03-14 20:14:48

0

你不能實例化一個接口,需要對其實施的一個工作。既然你已經決定放棄EasyMock(不知道爲什麼),那麼你需要實例化一個現有的接口實現,或者創建一個新的接口來進行測試。

0

您可以創建和Anoymous類如

MyInterface myMock = new MyInterface() { 
           ... methods implemented here 
          }; 
0

如果您需要驗證一個方法被調用的次數,您可以爲每個方法添加一個簡單的計數器成員。

例如

public void testMethod () 
{ 
    MyInterface mockObject = new MyInterface () { 
     public int MyMethodCount = 0; 
     public int MyFunctionCount = 0; 

     public void myMethod () 
     { 
      MyMethodCount++; 
      // NOOP 
     } 

     public int myFunction () 
     { 
      MyFunctionCount++; 
      return -1 ; 
     } 
    } 

    // Proceed with the test case using mockObject 
} 
0

在沒有模擬框架的情況下,java.lang.reflect.Proxy是最好的選擇。如果您以前從未使用過,則可以創建一個實現一組接口的動態對象,然後使用InvocationHandler檢查每個方法調用並決定要執行的操作。這是一種非常強大的技術(不僅限於測試),因爲您可以將方法調用委託給其他對象,等等......它還使您在執行此類委派時避免某些界面更改,因爲您不需要聲明每種方法。它適應於runtine界面。

public static interface MyIntf { 
    String foo(String arg1); 
} 

InvocationHandler invocationHandler = new InvocationHandler() { 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
     if (method.getName().equals("foo") && 
      method.getParameterTypes().length == 1 && 
      method.getParameterTypes()[0] == String.class) { 
      // do your mocking here. For now i'll just return the input 
      return args[0]; 
     } 
     else { 
      return null; 
     } 
    } 
}; 

MyIntf myintf = (MyIntf) Proxy.newProxyInstance(getClass().getClassLoader(), 
      new Class[] { MyIntf.class }, 
      invocationHandler); 

System.out.println(myintf.foo("abc"));