【问题标题】:How do I ignore an exception thrown by a private void method using easymock?如何使用 easymock 忽略私有 void 方法引发的异常?
【发布时间】:2014-10-20 03:22:23
【问题描述】:

我有一个做某事的 void 方法。我不在乎它在我的单元测试课上做了什么。但是,当我从我的单元测试类中调用它时它会引发异常,这会导致我的测试用例失败。

如何使用 EasyMock 模拟此对象,以便在调用此 void 方法时忽略它在单元测试中的作用?

例如,假设对象名为myObject,它有一个名为doSomething() 的void 方法。 EasyMock 不允许我使用 'expect',因为它是一个不返回任何内容的 void 方法。但是当我在我的测试用例中调用这个方法时,它会抛出一个异常(我想完全忽略它)。

我知道这可以通过使用 mockito 或其他库来实现,但我想使用 EasyMock。

更新

有问题的方法是一个私有的 void 方法,它被其他进程调用。我不能直接调用它,但我仍然想忽略该私有 void 方法引发的异常。

我已经尝试使用如下建议的 nice mock。

MyObject obj = EasyMock.createNiceMock(MyObject.class);
EasyMock.replay(obj);

然后我将这个 obj 设置在另一个包含它作为私有变量的对象中。

MyObject2 obj2 = new MyObject2();
obj2.setMyObject(obj);

我调用了一些在内部调用私有 void 方法的方法。

obj2.methodThatCallsPrivateVoidMethod();

这没有用。

【问题讨论】:

  • 如果您要模拟的方法是私有的,那么您将无法使用 EasyMock 模拟它,您需要使用PowerMock。话虽如此,从您问题的其余部分来看,MyObject 上有一个可访问的方法(公共、受保护、默认),您可以模拟出来,对吗?
  • 是的,但是我想对这个公共方法进行单元测试。只是为了让我可以忽略私有 void 方法的结果(尤其是固有的异常)
  • 在这种情况下,您必须使用 PowerMock 生成 MyObject 的部分模拟来模拟私有方法。这是可能的,但有点尴尬。 Here's the documentation for it

标签: java exception mocking void easymock


【解决方案1】:

在不使用 EasyMock 的情况下,一种常见的方法是在类的可测试版本中覆盖有问题的方法。

假设这是你的班级

class MyClass {
   ...
   public void doSomething() {
    ...
    }
}

在你的测试中这样做:

public class MyTestClass {

   @Test
   public void testThis {
      MyClass myObject = new TestableMyClass();
      ...
      // Now you can invoke methods on myObject and the 
      // doSomething() method will be harmless.
   }

   class TestableMyClass extends MyClass {
      @Override
      public void doSomething {
         // Do nothing.  Thus no exception.
      }
   }
}

请注意,EasyMock 可能会提供类似的方法来执行此操作,但我对 EasyMock 并不熟悉。我知道这不是 Mockito 的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2011-07-19
    • 2019-03-12
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多