在java中模拟调用外部方法

时间:2012-09-28 10:59:28

标签: java methods mocking easymock powermock

我有一个关于如何在java中模拟一些调用的问题,例如,假设我有这个:

import whatever.package;

Class myClass extends otherClass {

    public void myMethod() {
        ...
        int a = methodCall();
        ...
    }
}

问题是“methodCall()”来自包“whatever.package”,它是从“otherClass”继承而来的。是否可以模拟它以便返回我想要的任何内容?

非常感谢!!

2 个答案:

答案 0 :(得分:3)

在评论中澄清后

如果它继承了,你可以使用我提出的最后一个模式(测试扩展myClass)并简单地覆盖methodCall()


在这个答案中,我假设methodCall()是你拥有的另一个类的非静态方法。

让我们修改示例代码:

import whatever.package;

Class myClass 
{
    public void myMethod() 
    {
        ...
        anotherClass aClass = new anotherClass();
        int a = aClass.methodCall();
        ...
    }
}

所以,现在我们要模拟另一个类的methodCall()。

正常的程序是使用接口并在其他地方推出“接线”,以避免紧密耦合。对Dependancy Injection和类似概念进行一些研究。

简而言之,使用new anotherClass()可以创建紧耦合。您可以在myClass构造函数中或通过getter和setter注入anotherClass对象。我认为你需要嘲笑写单元测试。请考虑以下代码:

import whatever.package;

Class myClass 
{
    private IanotherClass another;

    public void SetAnotherClass(IAnotherClass aClass)
    {
         another = aClass;
    }

    public void myMethod() 
    {
        ...
         int a = another.methodCall();
        ...
    }
}

测试代码:

   myClass testedClass = new myClass();
   testedClass.SetAnotherClass(new MyAnotherClassMock());
   testedClass.myMethod();

至于注入依赖项和针对接口的编程,而不是实现,关于这个主题还有很多东西需要阅读 - 只是谷歌吧!

如果您不想重新设计整个代码并且只需要快速(并且有点脏)修复,您可以考虑将创建anotherClass实例移动到单独的方法中,然后简单地让您的测试类继承自您的类,覆盖提到方法(这根本不可能 - 一切都取决于你的实际代码)

示例:

Class myClass 
{
    public void myMethod() 
    {
        ...
        IanotherClass aClass = GetAnotherClassInstance();
        int a = aClass.methodCall();
        ...
    }

    protected IanotherClass GetAnotherClassInstance()
    {
        return new anotherClass();
    }
}

Class MyTestClass extends myClass
{
   @overwrite
   protected IanotherClass GetAnotherClassInstance()
   {
        return new anotherClassMock();
   }
}

然后只需使用myTestClass进行测试!

答案 1 :(得分:-1)

没有重新设计代码?

模拟methodCall的类并在classpathorder中将其推送。