使用 EasyMock 测试方法的异常

Posted

技术标签:

【中文标题】使用 EasyMock 测试方法的异常【英文标题】:Testing Exceptions of a method with EasyMock 【发布时间】:2012-09-11 17:17:03 【问题描述】:

我是单元测试的新手。我正在使用 TestNG 和 MyEclipse 为我的应用程序开发单元测试用例。在这样做时,我遇到了 EasyMock 的一些问题。这是我的代码(出于安全原因更改了类名称、方法名称和返回类型,但您会清楚地了解我在这里要实现的目标)。

    public MyClass
    
       // This is a method in my class which calls a collaborator which I
       // want to mock in my test case
       public SomeObject findSomething(SomeOtherObject param) throws Exception
       
          SomeOtherObject param a = myCollaborator.doSomething(param);
          // Do something with the object and then return it 
          return a;
       
    

现在这是我的测试。现在我真正想在我的测试中实现什么 情况是我想检查我的功能(findSomething)是否正确 在抛出异常的情况下抛出异常。未来一些 其他开发人员可以更改签名(抛出异常不是 实际上是方法签名的一部分)并删除抛出 我的方法例外。那么我怎样才能确保没有人改变 是吗?

@Test(dataProvider="mydataProvider", expectedExceptions=Exception.class)
public void MyTest(SomeOtherObject param) throws Exception 

  EasyMock.expect(myCollaboratorMock.doSomething(param)).andThrow(new Exception());
  EasyMock.replay(myCollaboratorMock);

我遇到了异常

"java.lang.IllegalArgumentException: 最后 在 mock 上调用的方法不能抛出 java.lang.Exception"

我是什么 在这里做错了吗?有人可以阐明如何编写测试 适合我的特定场景?

【问题讨论】:

【参考方案1】:

协作者的doSomething() 方法没有声明它可能会抛出异常,而您是在告诉它的mock 抛出一个异常。这是不可能的。

Exception 是一个已检查的异常。只有在方法签名中声明它才能被抛出。如果该方法没有throws 子句,它所能做的就是抛出运行时异常(即RuntimeException 或任何后代类)。

【讨论】:

错误。通过使用generic quirks,几乎可以从任何地方抛出已检查的异常。

以上是关于使用 EasyMock 测试方法的异常的主要内容,如果未能解决你的问题,请参考以下文章

测试没有使用 EasyMock 调用 void 方法

如何使用 EasyMock 测试 void 方法

EasyMock简单使用方法

EasyMock 作废方法

EasyMock:无效方法

让 EasyMock 模拟对象抛出异常