【问题标题】:Checked exception is invalid for this method Error检查的异常对此方法无效错误
【发布时间】:2020-12-06 06:32:15
【问题描述】:

据我所知,Scala 没有检查异常,即我不需要指定方法将抛出的异常。

我有一个 A 类的方法 a 正在测试中。它调用类b 的方法B。我想测试B 抛出异常时的行为。

class b{
    def B()={...}
}

我嘲笑过B

when(mockB.B).thenThrow(new UserDoesNotExistException("exception"))

当我这样做时,我收到错误Checked exception is invalid for this method!

这个答案解释了w.r.t。 Java - throw checked Exceptions from mocks with Mockito

虽然将 UserDoesNotExistException 更改为 RuntimeException 对我有用,但我很想知道是否可以通过抛出 UserDoesNotExistException 进行测试

在我的逻辑中,A 有不同的路径,具体取决于抛出的异常类型,因此我需要从我的测试中抛出特定的异常,而不是抛出通用的 RuntimeException

【问题讨论】:

    标签: scala mockito scalatest


    【解决方案1】:

    简短的回答是可以。你怎么能那样做?需要在 B 方法中添加 throws 注解:

    class b{
        @throws(classOf[UserDoesNotExistException])
        def B()={...}
    }
    

    根据Scala Cookbook关于 throws 的注释:

    首先,无论消费者使用的是 Scala 还是 Java,如果他们正在编写健壮的代码,他们都会想知道有什么地方失败了。其次,如果他们使用 Java,@throws 注解是 Scala 向 Java 消费者提供 throws 方法签名的方式。

    由于 Mockito.java 是用 java 编写的,它必须知道可以抛出哪些用户异常。 RuntimeException,不应该显式编写,因为它总是可以被抛出。

    另一个可能的解决方案是升级到最新的 mockito-scala(目前是 1.15.0 版),您可以使用:

    org.mockito.MockitoSugar.when
    

    这是纯scala,然后下面的代码应该可以工作:

    import org.mockito.MockitoSugar.{mock, when}
    val bMock = mock[b]
    when(bMock.B()).thenThrow(new UserDoesNotExistException("exception"))
    

    【讨论】:

      【解决方案2】:

      thenAnswer 也有效 -

      when(mockB.B).thenAnswer(invocation=>throw new UserDoesNotExistException("exception"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多