[英]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
...
}
}
我有以下疑问:
userService.findAll1()
和userService.findAll2()
的默认行为是什么? userService.findAll1()
和userService.findAll2()
返回相同的结果类型( List<User>
)。 第3行会否覆盖第2行中定义的行为? 我的意思是, userService.findAll1()
返回users2
而不是users1
吗? when
方法签名是public static <T> OngoingStubbing<T> when(T methodCall)
因此示例中的T
将是List<User>
类型的元素,其值可能为null
。 那么, when
方法如何确定不同的调用作为参数传递呢? 1.当模拟某些东西时,所有具有返回类型的方法默认情况下都将返回null(对于原语,则为等效方法)。 由于该模拟本身没有实现,因此对该方法的调用无济于事(基本上它像一个空方法一样处理)。
2.为什么会这样? 您将不同的返回值映射到不同的方法,则不可能覆盖某些内容。
Edit3:我刚刚删除了以前的尝试来对此进行解释。 链接的内容比我能提出的要好。 因此,这并不容易理解。
另一个注意事项:
您可能不需要使用反射将模拟对象放入对象中。 查看@InjectMocks和@Mock。 因此,您能否使用它们(或如何使用它们)取决于您的JUnit和Mockito版本。 ( 如何在JUnit5中使用Mockito )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.