Mockito的when和verify方法有什么区别?

3

我只需要知道:

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

2)如果我在when().thenReturn()中返回错误的值,像下面这样。测试用例会是“false”,还是会返回50而不是30?

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

3) 即使被模拟对象的方法是void类型,为什么我需要强制使用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()向模拟对象方法添加功能而不使用verify()吗,还是需要在调用when()方法后调用verify()呢?
2个回答

2

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

2) 它将返回默认值,取决于返回值的类型(例如,如果返回类型是Integer,则将返回0)。

3) 如果您使用了@Mock,则不需要为该模拟的void方法使用when.thenReturn。实现根本不会被调用。

4) when在测试的安排部分中使用,在调用测试方法之前。在断言部分中使用verify。在一个测试用例中同时使用它们并不是强制性的。您可以在适当的位置只使用when、只使用verify或两者都使用。


你说了一个问题的答案是“不”,但我认为它应该是“是”。当使用when()方法时,只会执行模拟对象的方法行为。只有在使用@spy注解时,才会调用真实对象的实际方法。请参考https://www.tutorialspoint.com/mockito/mockito_spying.htm。 - anand krish
当您在Mock对象中不使用when.thenReturn时,实现将不会被调用,您将获得默认返回值。如果您在Spied对象上不使用doReturn.when.then,则将调用真实方法。 - Maciej Kowalski
1
这个答案对于以下错误Mockito Exception: Wanted But Not Invoked非常有帮助。这让我意识到在调用被测试系统之前,在我的ACT阶段中我正在调用Mockito.verify(mock).method(argCapture)。请确保只在触发执行后的assert阶段使用verify!希望这能帮到你。 - undefined

1

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

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

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

所以,如果你像下面提到的那样编写一个assert,你的测试将会通过,因为你已经指定了需要该方法返回50而不是默认值:

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

3) 当thenReturn用于void方法时,你无法编写代码。Mockito会抛出错误,指出'The method when(T) in the type Mockito is not applicable for the arguments (void)'。对于void方法,你所能做的最多就是验证一个方法是否被调用了或者没有被调用。我相信你正在测试一个返回值并且不是void的方法。请不要混淆测试用例的返回类型和其中方法的返回类型。

如果需要在void方法中覆盖特定内容,你也可以使用doNothing()或doAnswer()。

4) 这检查mock对象上是否调用了该方法,并检查方法调用次数是否只有1次,对吗?- 对

如我在3)中提到的,verify主要用于测试void方法,而在其他测试中断言通常已经足够了。当方法没有返回任何内容时,你无法编写assert。这就是verify发挥作用的地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接