Mockito re-stub方法已经用然后throw进行了存根

2022-09-03 10:10:03

我遇到了一个嘲笑的问题。我正在开发一个Web应用程序。在我的测试中,用户管理被嘲笑。在某些情况下,我必须更改该方法返回的用户。getLoggedInUser()

问题是,我的方法也可以抛出一个.getLoggedInUser()AuthenticationException

因此,当我尝试从无用户切换到某个用户时,调用

when(userProvider.getLoggedInUser()).thenReturn(user);

抛出一个异常,因为已经存根了userProvider.getLoggedInUser()thenTrow()

有没有办法告诉方法不关心异常?when

提前致谢 - 伊斯特万


答案 1

在新的 Mockito 版本中,您可以使用存根连续调用在第一个 can 上抛出异常,并在第二个调用中返回值。

when(mock.someMethod("some arg"))
    .thenThrow(new RuntimeException())
    .thenReturn("foo");

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#10


答案 2

我对你的问题的第一反应是,听起来你试图在一次测试中做太多事情。

为了便于测试和简化,每个测试应该只测试一件事。这与单一责任原则相同。我经常发现程序员试图在一次测试中测试多个东西,并因此遇到各种各样的问题。因此,每个单元测试方法都应遵循以程:

  1. 为测试设置单个方案。
  2. 调用正在测试的类以触发正在测试的代码。
  3. 验证行为。

因此,就您而言,我希望至少看到两个测试。一个返回用户,另一个引发异常。这样,您就不会在尝试模拟模拟不同行为时遇到问题。getLoggedInUser()getLoggedInUser()

浮现在脑海中的第二个想法不是存根。考虑使用期望,因为您可以设置一系列期望。即,第一个调用返回一个用户,第二个调用引发异常,第三个调用返回一个不同的用户,依此类推。


推荐