Spring Data JPA+JUnit5测试中Mockito thenReturn方法参数类型不匹配问题求助
Spring Data JPA+JUnit5测试中Mockito thenReturn方法参数类型不匹配问题求助
嗨,我来帮你分析下这个问题的根源和解决办法:
问题原因:类型完全不匹配
你的AddressRepository里的get()方法定义的返回类型是Optional<AddressView>,但你在测试中试图返回AddressWrapper实例——这两个类型没有任何继承或实现关系,Mockito会严格校验返回值的类型,所以才会抛出Cannot resolve method 'thenReturn(AddressWrapper)'的错误。
简单来说:你承诺要返回一个“地址视图(AddressView)的可选实例”,但实际给了一个“地址包装器(AddressWrapper)”,类型完全对不上。
解决方案:返回正确类型的对象
我们需要构造一个AddressView类型的实例(或者它的mock对象),然后包装到Optional里返回,具体有两种常用方式:
方式1:用Mockito直接模拟AddressView
这是最常用的测试方式,不需要手写实现类:
@Test public void addressRequest() { // 1. 模拟一个AddressView实例 AddressView mockAddressView = Mockito.mock(AddressView.class); // 按需设置视图方法的返回值,比如getName() when(mockAddressView.getName()).thenReturn("测试街道名称"); // 2. 让repository的get方法返回包含这个mock实例的Optional // 注意:测试里不用写@Param,用参数匹配器(比如anyString())或者具体值即可 when(addressRepository.get(anyString())).thenReturn(Optional.of(mockAddressView)); // 3. 执行你的测试逻辑并验证结果... }
方式2:手写AddressView的实现类(适合简单场景)
如果你的AddressView接口方法不多,也可以自己写一个简单的实现类:
// 先写一个AddressView的实现类 class AddressViewImpl implements AddressView { private String name; // 可以根据接口里的其他方法添加对应的字段 public AddressViewImpl(String name) { this.name = name; } @Override public String getName() { return name; } // 实现接口里的其他方法... } // 然后在测试中使用 @Test public void addressRequest() { AddressView realAddressView = new AddressViewImpl("实际测试的街道名"); when(addressRepository.get("具体的测试ID")).thenReturn(Optional.of(realAddressView)); // 测试逻辑... }
额外提醒
你测试代码里的when(addressRepository.get(@Param("id") String id......))写法是错误的,@Param注解是在Spring Data JPA的Repository方法参数上用的,测试中不需要添加,直接用参数匹配器(比如anyString())或者具体的字符串参数即可。
备注:内容来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

