我目前使用的EasyMock像這樣創建模擬對象,而框架
mockedObject = createMock(myInterface.class);
簡易模擬創建模擬對象是不必要的開銷(因爲我嘲笑的方法是非常簡單的),我想創建一個沒有它的模擬。
但問題是myInterface是一個接口,所以我如何實例化它。請建議。
感謝, 斯利拉姆
我目前使用的EasyMock像這樣創建模擬對象,而框架
mockedObject = createMock(myInterface.class);
簡易模擬創建模擬對象是不必要的開銷(因爲我嘲笑的方法是非常簡單的),我想創建一個沒有它的模擬。
但問題是myInterface是一個接口,所以我如何實例化它。請建議。
感謝, 斯利拉姆
最簡單的方法是創建一個實現接口的內部類,實現返回所需數據的方法,然後在測試用例中使用它。
例如:
public void testMethod ()
{
MyInterface mockObject = new MyInterface () {
public void myMethod ()
{
// NOOP
}
public int myFunction ()
{
return -1 ;
}
}
// Proceed with the test case using mockObject
}
你不能實例化一個接口,需要對其實施的一個工作。既然你已經決定放棄EasyMock(不知道爲什麼),那麼你需要實例化一個現有的接口實現,或者創建一個新的接口來進行測試。
您可以創建和Anoymous類如
MyInterface myMock = new MyInterface() {
... methods implemented here
};
如果您需要驗證一個方法被調用的次數,您可以爲每個方法添加一個簡單的計數器成員。
例如
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
}
在沒有模擬框架的情況下,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"));
創建一個內部類是一個很好的做法,只是好奇嗎? – sriram 2012-03-14 20:06:14
這取決於你是否會再次重用該類的特定實現。就我而言,許多模擬對象是作爲匿名內部類開始的,當我開始重用它們時,發現自己被提升爲完整的飛行類。 – 2012-03-14 20:07:44
匕首。非常感謝! – sriram 2012-03-14 20:14:48