调用同方法返回两个不同的mock值
时间: 2023-07-16 16:15:58 浏览: 165
你可以使用 Jest 中的 `mockReturnValueOnce` 方法来实现。这个方法可以让你为同一个 mock 函数指定多个返回值,每次调用函数时返回一个不同的值。
例如,假设你有一个叫做 `getRandomNumber` 的函数,它返回一个随机数。你想对它进行模拟,使其在第一次调用时返回 1,在第二次调用时返回 2。可以这样写:
```javascript
const getRandomNumber = jest.fn()
.mockReturnValueOnce(1)
.mockReturnValueOnce(2);
console.log(getRandomNumber()); // 输出 1
console.log(getRandomNumber()); // 输出 2
```
在这个例子中,我们首先使用 `jest.fn()` 创建了一个名为 `getRandomNumber` 的 mock 函数。然后,我们使用 `mockReturnValueOnce` 方法为它指定了两个返回值。第一次调用 `getRandomNumber` 时,它返回 1。第二次调用时,它返回 2。
你可以根据需要添加更多的 `mockReturnValueOnce` 方法,以便让 mock 函数返回不同的值。
相关问题
Mockito.when一个多层调用的方法怎么写
您可以使用 Mockito 的链式调用来模拟多层调用的方法。例如,假设您有一个名为 `userService` 的服务,该服务中有一个名为 `getUserAddress` 的方法,该方法将调用另一个名为 `addressService` 的服务中的方法。您可以使用以下代码模拟这两个方法的调用:
```
// 创建 Mock 对象
UserService userService = Mockito.mock(UserService.class);
AddressService addressService = Mockito.mock(AddressService.class);
// 模拟 getUserAddress 方法
Mockito.when(userService.getUserAddress(Mockito.anyLong())).thenAnswer(invocation -> {
Long userId = invocation.getArgument(0);
Address address = addressService.getAddress(userId);
return address;
});
// 模拟 getAddress 方法
Mockito.when(addressService.getAddress(Mockito.anyLong())).thenReturn(new Address("123 Main St."));
```
在上面的代码中,我们首先创建了 `UserService` 和 `AddressService` 的 Mock 对象。然后,我们使用 `when` 方法来模拟 `getUserAddress` 方法的调用。在模拟 `getUserAddress` 方法时,我们使用了 `thenAnswer` 方法来自定义方法的行为。在该方法中,我们获取了 `getUserAddress` 方法的参数,并使用 `addressService` 来获取用户的地址。最后,我们返回了模拟的地址对象。
接下来,我们使用 `when` 方法来模拟 `getAddress` 方法的调用。在模拟 `getAddress` 方法时,我们使用了 `thenReturn` 方法来指定方法的返回值。
通过这种方式,我们可以模拟多层调用的方法并指定它们的行为。
写一个测试静态方法的mock测试
假设我们有一个名为Calculator的静态类,其中有一个名为add的静态方法,接收两个整数作为参数并返回它们的和。我们可以使用mockito框架来测试这个静态方法。以下是一个示例代码:
```java
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.mockito.MockedStatic;
public class CalculatorTest {
@Test
public void testAdd() {
try (MockedStatic<Calculator> calculatorMock = mockStatic(Calculator.class)) {
int num1 = 5;
int num2 = 7;
int expected = 12;
calculatorMock.when(() -> Calculator.add(num1, num2)).thenReturn(expected);
int actual = Calculator.add(num1, num2);
assertEquals(expected, actual);
}
}
}
```
在这个测试中,我们使用了MockedStatic类来模拟Calculator类的静态方法。我们使用mock()方法创建一个Calculator类的静态模拟实例,并使用when()方法指定当调用add()方法时返回预期的结果。最后,我们调用add()方法并使用assertEquals()方法来验证实际结果是否等于预期结果。
需要注意的是,我们使用了try-with-resources语句来自动关闭MockedStatic实例,以确保在测试结束时清理模拟。
阅读全文