gpt4 book ai didi

java - Mockito 默认行为和具有相同返回类型的方法的自定义行为

转载 作者:行者123 更新时间:2023-11-30 01:50:10 25 4
gpt4 key购买 nike

假设我有以下代码要测试 UserController通过 mock UserService (其中 UserController 引用 UserService ):

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
...

public class UserControllerTest {
private final List<User> users1 = new ArrayList<>();
private final List<User> users2 = new ArrayList<>();

@Before
public void initUsers() {
User user = new User();
user.setId(1L);
users1.add(user);

User user = new User();
user.setId(2L);
users2.add(user);
}

@Test
public void testFindAlls() throws Exception {
UserService userService = mock(UserService.class); //line1
when(userService.findAll1()).thenReturn(users1); //line2
when(userService.findAll2()).thenReturn(users2); //line3

UserController userController = new UserController();
ReflectionTestUtils.setField(userController, "userService", userService);
List<User> users3 = userController.findAll1(); //line4
List<User> users4 = userController.findAll2(); //line5

...
}
}

我有以下疑问:

  1. 到达第 1 行时, userService.findAll1() 的默认行为是什么?和userService.findAll2()
  2. 当到达第3行时,如userService.findAll1()userService.findAll2()返回相同的结果类型( List<User> )。 line3 会覆盖 line2 中定义的行为吗?我的意思是,会userService.findAll1()返回users2而不是users1
  3. 我的意思是,when方法签名是 public static <T> OngoingStubbing<T> when(T methodCall)所以T在示例中将是 List<User> 类型的元素其值可能为 null 。那么,如何when方法能够确定不同的调用作为参数传递吗?

最佳答案

1.当你模拟某些东西时,所有具有返回类型的方法都会默认返回 null (或者在基元情况下返回等效值)。由于模拟本身没有实现,因此对该方法的调用不会执行任何操作(基本上它像空方法一样处理)。

2.为什么会这样呢?您将不同的返回值映射到不同的方法,不可能覆盖某些内容。

编辑3:我刚刚删除了之前对此进行解释的尝试。链接的内容比我能想到的任何内容都好。所以不太容易理解。

How does mockito when() invocation work?

<小时/>

另外一点:
您可能不需要使用反射将模拟放入您的对象中。查看@InjectMocks 和@Mock。因此,是否可以使用它们(或如何使用它们)取决于您的 JUnit 和 Mockito 版本。(How to use Mockito with JUnit5)

关于java - Mockito 默认行为和具有相同返回类型的方法的自定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56357499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com