当前位置: 首页 > 知识库问答 >
问题:

Mockito:了解当(). thenThrow()函数如何工作

孟英锐
2023-03-14
when(mockObj.method(param1, param2)).thenReturn(1);
when(mockObj.method(param1, param2)).thenReturn(2);

当模拟对象中具有相同参数列表的方法返回值时,如果存在冲突语句,我观察到将返回最近的When/thenReturn。因此,下面的陈述将是正确的。

assertEquals(2, mockObj.method(param1, param2));

当有冲突语句抛出异常时,行为与上面不一样。例如,

@Test(expected = ExceptionTwo.class)
public void testMethod() {
    when(mockObj.method(param1, param2)).thenThrow(ExceptionOne.class);
    when(mockObj.method(param1, param2)).thenThrow(ExceptionTwo.class);
    mockObj.method(param1, param2);
}

这个测试用例失败了。任何解释都会有帮助。

共有2个答案

姬昊焱
2023-03-14

第一个例子是根据设计,你可以参考下面的链接了解更多细节。

https://static.javadoc.io/org.mockito/mockito-core/2.11.0/org/mockito/Mockito.html#stubbing_consecutive_calls

在第二个示例中,当(mockObj.method(param1,param2))再次尝试注册存根时引发了异常。然后掷骰子(两级除外) 。请注意,这不是由于声明mockObj引起的。方法(参数1,参数2)

在我看来,第二次时可能会有实际的方法调用。然后执行throw语句。如果希望后续调用有不同的异常,可以在(mockObj.method(param1,param2))时合并到一条语句when中。然后抛出(ExceptionOne.class,ExceptionTwo.class)

欧阳洲
2023-03-14

在第一种情况下,正如这里提到的文件

Warning : if instead of chaining .thenReturn() calls, 
multiple stubbing with the same matchers or arguments is used, 
then each stubbing will override the previous one.

所以第二个将覆盖第一个。因此,返回2。在其他情况下,您可以在此处参考:

when(mock.foo()).thenThrow(new RuntimeException());

//Impossible: the exception-stubbed foo() method is called so RuntimeException is thrown.
when(mock.foo()).thenReturn("bar");

//You have to use doReturn() for stubbing:
doReturn("bar").when(mock).foo();

当你使用When。。然后返回,将调用存根方法。第一次你没有观察到它,因为它是在模拟对象上调用的。但是当你第二次写when时,我们就有了mock的一些行为。foo()(您之前将其设置为抛出异常)。因此,第二个当(…)语句在您的情况下引发异常。所以你应该使用doThrow()。当(…)。方法(…)相反

 类似资料:
  • 鉴于以下Mockito语句: 假设mock.method()语句将返回值传递给when(),Mockito如何为mock创建代理?我想这使用了一些CGLib的东西,但我想知道这是如何在技术上完成的。

  • 我正在使用Mockito来模拟服务层的方法。 试图嘲笑以下代码行 为了嘲笑我正在使用的这个 但问题是当代码到达行

  • 我在测试跟随功能。 下面是测试代码。 我定义了以下变量。 问题是不会引发异常。所以测试一直失败。 请告诉我我缺少的东西。

  • 正如标题所解释的,我有一个非常基本的编程问题,但我还没有找到。过滤掉所有(非常聪明的)“为了理解递归,你必须首先理解递归。”各种在线线程的回复我仍然不太明白。 当我们面对不知道自己不知道的事情时,我们可能会提出错误的问题或错误地提出正确的问题。我将分享我的“想法”。我的问题是希望有类似观点的人能够分享一些知识,帮助我打开递归灯泡! 以下是函数(语法用Swift编写): 我们将使用2和5作为参数:

  • 问题内容: 在python中,是没有重复元素的无序集合。但是,我无法理解它如何生成输出。 例如,考虑以下内容: 应该不是的输出是:?我在Python 2.6中尝试了以上两个。 问题答案: 正如您所说,集合是无序的。即使实现集合的一种方法是使用树,也可以使用哈希表来实现(这意味着按排序顺序获取键可能并不那么琐碎)。 如果您想对它们进行排序,则可以执行以下操作: 这将产生一个包含集合元素的排序列表。(

  • 问题内容: 给出以下Mockito语句: 考虑到嘲笑方法将返回值传递给when(),Mockito如何为该嘲笑创建代理?我想这会使用一些CGLib的东西,但是有兴趣知道这在技术上是如何完成的。 问题答案: 简短的答案是,在您的示例中,的结果mock.method()将是类型合适的空值;Mockito通过代理,方法拦截和类的共享实例使用间接方式,MockingProgress以确定对模拟方法的调用是