【问题标题】:Mockito when and verify method differenceMockito when 和 verify 方法差异
【发布时间】:2017-09-29 14:51:36
【问题描述】:

我只需要知道

1)当我在Mockito中调用when()时,它实际上是在执行mockedObject方法的行为吗?

2) 如果我在when().thenReturn() 中返回错误值,如下所示。测试用例将是“假”还是返回 50 而不是 30?

 when(mockedObject.add(10,20)).thenReturn(50);

3) 为什么我需要强制使用thenReturn(),即使模拟对象方法无效? (当我不使用 thenReturn() 时它会出错。

使用 when() 方法向模拟对象添加功能。

@Test
public void testAdd(){
 when(mockedObject.add(20.0,30.0)).thenReturn(50.00);
}

4) 如果我打电话

  verify(mockedObject,times(1)).add(20.0, 30.0);

它会检查方法是否在模拟对象上调用,是否使用相同的参数,并且只检查对方法的调用 1 次,对吗?那么我可以使用 when() 向模拟对象方法添加 functionality 而不使用 verify() 或者它实际上需要调用 verify( ) 调用 when() 方法后

【问题讨论】:

    标签: java unit-testing mocking mockito mockitowhen


    【解决方案1】:

    1) 不,除非您使用@Spy 而不是@Mock。这就是为什么你甚至可以模拟一个界面。

    2) 根据返回值的类型返回默认值(例如返回类型为整数时返回0)。

    3) 如果你使用了@Mock,那么你就不需要使用when.thenReturn 作为那个mock 的void 方法。根本不会调用实现。

    4) 在调用被测方法之前,when 用于测试的排列部分。 verify 在断言部分的调用之后使用。 在一个测试用例中同时使用它们不是强制性的。您只能在适当的地方使用when,两者中的verify

    【讨论】:

    • 1) 你对 1 个问题说不,我认为是。 when() 将仅执行 mockedObject 方法行为。当您使用@spy 时,我认为只有真实对象的实际方法才会被调用。检查这个tutorialspoint.com/mockito/mockito_spying.htm
    • 当你不使用 when.thenRetrun 作为一个 Mocked 对象时,实现不会被调用,你会得到默认的返回值。如果你不在一个 Spied 对象上使用 doReturn.when.then,那么一个真正的方法将被调用
    【解决方案2】:

    1) 当您使用模拟时,您正在创建类的模拟来代替实际的类。由于这样创建的对象在调用类的某个方法时不知道该做什么,因此您需要使用 when/then 来模拟该行为。答案是否定的,因为您正在指定需要在测试用例中执行的行为。当您使用 new 构造函数创建类的对象或使用@Spy 尽可能复制实际行为时,将执行真实行为。

    2) 当您在测试用例中指定以下行时,您将指示运行器在使用参数 10、20 调用 add() 时返回 50。

    when(mockedObject.add(10,20)).thenReturn(50);
    

    所以是的,如果您编写如下所述的断言,您的测试将通过,因为您提到您需要该方法返回 50 而不是默认值:

    assertEquals(50, mockedObject.add(10,20));
    

    3) void 方法的 thenReturn 时不能写。 Mockito 会抛出错误提示 'The method when(T) in type Mockito is not applicable for the arguments (void)'。 对于 void 方法,您可以做的最大工作是验证是否已调用方法。我相信您正在测试一种确实返回某些东西并且不是无效的方法。请不要将测试用例的返回类型与其中方法的返回类型混淆。

    您还可以将 doNothing() 或 doAnswer() 与 void 方法一起使用,以防您需要覆盖其中的特定内容。

    4) 它检查方法是否在模拟对象上调用,参数是否相同,并且只检查对方法的调用 1 次,对吗? - 右

    verify 正如我在 3) 中提到的,主要用于测试 void 方法,并且是在大多数情况下断言就足够的其他测试中的附加值。当方法不返回任何内容时,您不能编写断言。这就是验证的用武之地。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      相关资源
      最近更新 更多