我目前正在使用EasyMock并创建像这样的模拟对象
mockedObject = createMock(myInterface.class);
Easy mock是一个不必要的开销(因为我模拟的方法非常简单),我想创建一个没有它的模拟。
但问题是myInterface是一个接口,所以我该如何实例化它。请建议。
谢谢, 斯利拉姆
答案 0 :(得分:3)
最简单的方法是创建一个实现接口的内部类,实现返回所需数据的方法,然后在测试用例中使用它。
例如:
public void testMethod ( )
{
MyInterface mockObject = new MyInterface ( ) {
public void myMethod ( )
{
// NOOP
}
public int myFunction ( )
{
return -1 ;
}
}
// Proceed with the test case using mockObject
}
答案 1 :(得分:1)
在没有模拟框架的情况下,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"));
答案 2 :(得分:0)
您无法实例化接口,您需要使用其中一个实现。由于您已决定放弃EasyMock(不确定原因),因此您需要实例化现有的一个接口实现,或者创建一个仅用于测试的新实现。
答案 3 :(得分:0)
您可以创建匿名类ep>
MyInterface myMock = new MyInterface() {
... methods implemented here
};
答案 4 :(得分:0)
如果您需要验证调用方法的次数,可以为每种方法添加一个简单的计数器成员。
e.g。
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
}