【问题标题】:EasyMock test an exception is thrown in the middle of codeEasyMock 测试代码中间抛出异常
【发布时间】:2017-01-04 07:00:19
【问题描述】:

我正在使用 EasyMock 编写测试,并且有一段这样的源代码:

public void doSomething(){
    try
    {
        // Do something
    }
    catch (RejectedExecutionException ex)
    {
        // just add some metrics here, no big action
    }
}

我正在为抛出RejectedExecutionException的情况编写测试,但最终没有抛出异常,这意味着我不能使用ExpectedException。那么我应该如何使用 EasyMock 测试这个异常是否会抛出一次呢?

【问题讨论】:

  • “最终没有抛出异常”是什么意思
  • @Abhishek 表示 catch 后不抛出异常

标签: java exception easymock


【解决方案1】:

我不认为你有一个干净的方式来使用任何模型框架来做到这一点。不过,我可以建议您以下解决方案。

解决方案 1

修改doSomething()的代码如下:

public void doSomething(){
    try
    {
        doSomethingImpl(); // throws RejectedExecutionException
    }
    catch (RejectedExecutionException ex)
    {
        // just add some metrics here, no big action
    }
}. 

现在对应该抛出异常的doSomethingImpl() 和不应该使用相同输入数据和状态的doSomething() 进行测试。

解决方案 2

你捕捉到代码做某事,不是吗?例如调用log.error()。您可以验证特定呼叫确实发生并且只发生了一次。我不记得使用 EasyMock 执行此操作的具体语法,但使用 Mockito 非常简单:使用 Mockito.verify()

解决方案 3 您可以使用 PowerMock 检查是否调用了异常的构造函数。它不是很干净,因为理论上您可以创建异常实例但不要抛出它,但总比没有好。

也许您甚至可以组合这些解决方案。但是我相信第一个是最好的。

【讨论】:

    【解决方案2】:

    Do something 部分调用模拟抛出异常?

    如果是,请expect(mock.methodCalled()).andThrow(new RejectedExecutionException());

    然后在测试结束时EasyMock.verify(mock)。这将确保 methodCalled 被调用一次且仅被调用一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2014-05-10
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多