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



支持我有以下代码通过模拟UserService来测试UserController(其中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> (。第 3 行是否会覆盖第 2 行中定义的行为?我的意思是,userService.findAll1()users2而不是users1返回吗?
  3. 我的意思是,when方法签名是public static <T> OngoingStubbing<T> when(T methodCall)的,因此示例中T将是类型为 List<User> 的元素,其值可能为 null .那么,when方法如何能够确定不同的调用作为参数传递呢?

1.当你模拟某物时,所有方法(具有返回类型(默认情况下只会返回 null(或在原语的情况下返回等效项(。由于模拟本身没有实现,因此对该方法的调用什么都不做(基本上它像空方法一样处理(。

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

编辑3:我刚刚删除了我之前尝试扩展这个。链接的内容比我能想到的任何东西都要好。所以这并不容易理解。

当((调用时,mockito 如何工作?


另一方面:
您可能不需要使用反射将模拟放入对象中。查看@InjectMocks & @Mock。因此,您可以使用它们(或如何使用它们(取决于您的JUnit和Mockito版本。(如何将Mockito与JUnit5一起使用(

最新更新