【发布时间】:2020-06-03 23:45:00
【问题描述】:
我正在尝试为按名称查找Players 的服务层方法编写单元测试。该方法调用 JPA 存储库方法并返回一个 Page 对象。
我希望测试验证是否确实调用了存储库中的正确方法。
测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {PlayerService.class})
public class PlayerServiceTest {
@Autowired
PlayerService playerService;
@MockBean
PlayerRepository playerRepository;
@Test
public void whenListPlayersByName_thenShouldCallFindMethodWithPageableArgAndNameArg(){
Pageable pageableStub = Mockito.mock(Pageable.class);
String name = "xxx";
Mockito.when(playerRepository.findByNameContainingIgnoreCase(any(String.class), any(Pageable.class)))
.thenReturn(any(Page.class));
//1st attempt:
//playerService.listPlayersByName(name, pageableStub);
playerService.listPlayersByName(eq(name), pageableStub);
verify(playerRepository).findByNameContainingIgnoreCase(any(String.class), any(Pageable.class));
}
我的问题
测试失败并显示一条消息:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at com.domin0x.player.PlayerServiceTest.whenListPlayersByName_thenShouldCallFindMethodWithPageableArgAndNameArg(PlayerServiceTest.java:60)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
按照建议,我将name 更改为eq(name),但这会导致不同的问题:
Argument(s) are different! Wanted:
com.domin0x.player.PlayerRepository#0 bean.findByNameContainingIgnoreCase(
<any java.lang.String>, <any org.springframework.data.domain.Pageable>);
Actual invocation has different arguments:
com.domin0x.player.PlayerRepository#0 bean.findByNameContainingIgnoreCase(
null, Mock for Pageable, hashCode: 309271464
;
有什么建议我应该在测试中改变什么?
服务类
@Service
public class PlayerService {
public Page<Player> listPlayersByName(String name, Pageable pageable) {
return repository.findByNameContainingIgnoreCase(name, pageable);
}
存储库界面
@Repository
public interface PlayerRepository extends JpaRepository<Player, Integer> {
Page<Player> findByNameContainingIgnoreCase(String name, Pageable pageable);
}
【问题讨论】:
-
我没有看到
eq()在任何地方使用。我看到any()用了几个地方。您确定您共享的代码与正在使用的代码相同吗? -
我想我找到了你的问题,添加了答案。
-
我在没有使用
eq()的情况下发布了playerService.listPlayersByName电话,因为那是我最初的尝试。我现在编辑了测试方法代码以使其更清晰。 -
你在下面看到我的回答了吗?