Scala 检查异常对此方法错误无效

Scala 检查异常对此方法错误无效,scala,mockito,scalatest,Scala,Mockito,Scalatest,据我所知,Scala没有检查异常,也就是说,我不需要指定方法将抛出的异常 我有一个a类的a方法正在测试中。它调用类B的方法B。我想测试B抛出异常时的行为 b类{ def B()={…} } 我嘲笑了B when(mockB.B).thenthow(新用户不存在异常(“异常”)) 当我这样做时,我得到错误检查异常对于这个方法是无效的 这就解释了w.r.t.Java- 虽然将UserDoesNotExistException更改为RuntimeException对我很有效,但我很想知道是否可以通

据我所知,Scala没有检查异常,也就是说,我不需要指定方法将抛出的异常

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

b类{
def B()={…}
}
我嘲笑了
B

when(mockB.B).thenthow(新用户不存在异常(“异常”))
当我这样做时,我得到错误
检查异常对于这个方法是无效的

这就解释了w.r.t.
Java
-

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


在我的逻辑中,
A
有不同的路径,这取决于抛出的异常类型,因此我需要从测试中抛出特定的异常,而不是抛出泛型
运行时异常

简短的回答是可以的。你怎么能做到?您需要将抛出注释添加到B方法:

class b{
    @throws(classOf[UserDoesNotExistException])
    def B()={...}
}
根据注释:

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

因为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"))

然后回答
同样有效-

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