当前位置: 首页 > 知识库问答 >
问题:

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

太叔正文
2023-03-14
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 )。第3行会覆盖第2行定义的行为吗?我的意思是,userservice.findall1()会返回users2而不是users1吗?
  3. 我的意思是,when方法签名是public static ongoingstubbing when(T methodCall) so在示例Tlist 类型的元素,其值可能为null。那么,When方法如何能够确定不同的调用是作为参数传递的?

共有1个答案

陆飞捷
2023-03-14

1.当您模拟某样东西时,所有具有返回类型的方法在默认情况下只返回null(如果是原语,则返回等价物)。由于模拟本身没有实现,因此对方法的调用什么也不做(基本上它像空方法一样处理)。

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

编辑3:我只是删除了我以前试图扩展这个。链接的内容比我能想出的任何东西都好。所以不容易理解。

 类似资料:
  • 只是延伸问题... 抽象类和接口中的相同方法 假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称签名),但返回类型不同。现在,当我重写方法时,只有当我使返回类型与接口声明相同时,它才会编译。 另外,如果该方法在抽象类或接口中声明为private或final,会发生什么情况? **旁注。在一次采访中,爱因斯坦先生在这个问题上坚持了相当长的时间。有没有一个流行的场景,我们这样做,或者

  • 我说的是Java,但这个概念也适用于其他语言-- 我们在同一个类上有两个方法,它们具有相同的基本功能,但提供不同的返回类型。这两种方法都会给你所有的东西,但一个得到一个可以提供对所有东西的访问的可迭代的,一个得到一个包含所有东西的集合。 我们知道你不能这样做(因为它不会编译): 那么,有人想过如何命名这些方法吗?这似乎是一个简单的解决方法: 然而,这显然有些冗长,可能不是最好的解决方案。我问的这个

  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 在Java8中,如果我有两个具有不同(但兼容)返回类型的接口,反射告诉我这两个方法中的一个是默认方法,即使我实际上没有将该方法声明为默认方法或提供方法体。 例如,以以下代码段为例: Java 1.8生成以下输出: 这看起来很奇怪,不仅因为这两种方法都存在,还因为其中一种方法突然莫名其妙地变成了默认方法。 在Java7中运行相同的代码会产生一些不那么出乎意料的东西,尽管仍然令人困惑,因为这两个方法具