繁体   English   中英

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

[英]Mockito default behaviour and custom behaviour with methods with identical return types

假设我有以下代码通过模拟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. 当到达line1时, userService.findAll1()userService.findAll2()的默认行为是什么?
  2. 到达第3行时,as 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(对于原语,则为等效方法)。 由于该模拟本身没有实现,因此对该方法的调用无济于事(基本上它像一个空方法一样处理)。

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

Edit3:我刚刚删除了以前的尝试来对此进行解释。 链接的内容比我能提出的要好。 因此,这并不容易理解。

Mockito when()调用如何工作?


另一个注意事项:
您可能不需要使用反射将模拟对象放入对象中。 查看@InjectMocks和@Mock。 因此,您能否使用它们(或如何使用它们)取决于您的JUnit和Mockito版本。 如何在JUnit5中使用Mockito

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM