无框架创建模拟对象

时间:2012-03-14 19:58:49

标签: java mocking

我目前正在使用EasyMock并创建像这样的模拟对象

mockedObject = createMock(myInterface.class);

Easy mock是一个不必要的开销(因为我模拟的方法非常简单),我想创建一个没有它的模拟。

但问题是myInterface是一个接口,所以我该如何实例化它。请建议。

谢谢, 斯利拉姆

5 个答案:

答案 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
}