mockito没用过,这次使用java,引入mock试了下。有些内容需要记录下:
@MockBean使用。使用这个注解,就可以替换掉spring中的bean了。
之前使用@spy,@injectmocks @mock会有问题,是因为A ->b,A -> c,b->d,c->d
此时如果只想mock,c,d,不mock b。但是b在涉及d的调用时候,使用d的mock对象。是做不到的。除非再@injectmocks一个b。然后将b作为set方法的参数传入给A。
但是以上那么做太丑陋。因此选用@Autowired和@MockBean就能够解决此问题
给出一个例子:
@SpringBootTest(classes = PokerAuthApplication.class)
@ActiveProfiles("local")
@Slf4j
public class PowerRankMQListenerTest {
@Autowired
private PowerRankMQListener powerRankMQListener;
@MockBean
private SngInfoRecordMapper sngInfoRecordMapper;
@MockBean
private MessageConsumerMapper messageConsumerMapper;
@MockBean
private RankingService rankingService;
@MockBean
private UserSngRecordMapper userSngRecordMapper;
@MockBean
private RocketMQTemplate rocketMQTemplate;
private List<List<MTTRankingVO>> redisDieUsers;
private List<List<UserSngVO>> userSngs;
private List<PowerRankMQMsg> msgs;
@BeforeEach
public void beforeClass() {
redisDieUsers = new ArrayList<List<MTTRankingVO>>();
List<MTTRankingVO> test1 = List.of(MTTRankingVO.builder().userID("9").diedTime(100l).rank("1").build(), MTTRankingVO.builder().userID("8").diedTime(100l).rank("1").build());
List<MTTRankingVO> test2 = List.of(MTTRankingVO.builder().userID("9").diedTime(100l).rank("2").build());
List<MTTRankingVO> test3 = List.of(MTTRankingVO.builder().userID("9").diedTime(100l).rank("2").build(), MTTRankingVO.builder().userID("8").diedTime(100l).rank("2").build());
List<MTTRankingVO> test4 = List.of(MTTRankingVO.builder().userID("9").diedTime(100l).rank("2").build(), MTTRankingVO.builder().userID("8").diedTime(100l).rank("2").build(),
MTTRankingVO.builder().userID("7").diedTime(100l).rank("3").build());
redisDieUsers.add(test1);
redisDieUsers.add(test2);
redisDieUsers.add(test3);
redisDieUsers.add(test4);
userSngs = new ArrayList<>();
List<UserSngVO> t1 = List.of(UserSngVO.builder().userID("9").sngID("2").status(2).power(1200l).costPoints(0l).build(), UserSngVO.builder().userID("8").sngID("2").status(2).power(1000l).costPoints(0l).build());
List<UserSngVO> t2 = List.of(UserSngVO.builder().userID("9").sngID("2").status(2).power(1200l).costPoints(0l).build(), UserSngVO.builder().userID("8").sngID("2").status(2).power(1000l).costPoints(0l).build());
List<UserSngVO> t3 = List.of(UserSngVO.builder().userID("9").sngID("2").status(2).power(1200l).costPoints(0l).build(), UserSngVO.builder().userID("8").sngID("2").status(2).power(1000l).costPoints(0l).build(),
UserSngVO.builder().userID("7").sngID("2").status(2).power(1000l).costPoints(0l).build());
List<UserSngVO> t4 = List.of(UserSngVO.builder().userID("9").sngID("2").status(2).power(1200l).costPoints(0l).build(),
UserSngVO.builder().userID("10").sngID("2").status(2).power(1000l).costPoints(0l).build(),
UserSngVO.builder().userID("8").sngID("2").status(2).power(1000l).costPoints(0l).build(),
UserSngVO.builder().userID("5").sngID("2").status(2).power(1000l).costPoints(0l).build());
userSngs.add(t1);
userSngs.add(t2);
userSngs.add(t3);
userSngs.add(t4);
msgs = List.of(PowerRankMQMsg.builder().bizID("1").mttID("2").sameRankUserIDs(List.of("9", "8")).IDType("sng").build(),
PowerRankMQMsg.builder().bizID("1").mttID("2").sameRankUserIDs(List.of("9", "8")).IDType("sng").build(),
PowerRankMQMsg.builder().bizID("1").mttID("2").sameRankUserIDs(List.of("9", "8")).IDType("sng").build(),
PowerRankMQMsg.builder().bizID("1").mttID("2").sameRankUserIDs(List.of("8", "9", "7")).IDType("sng").build());
}
@Test
public void testonMessage() {
Mockito.when(messageConsumerMapper.exists(Mockito.any())).thenReturn(false);
SngInfoPO sngInfoPo = new SngInfoPO();
sngInfoPo.setStatus(MttStatus.RUNNING.getCode());
Mockito.when(sngInfoRecordMapper.getSngBySngId(Mockito.any())).thenReturn(sngInfoPo);
for (int i = 0; i < msgs.size(); i++) {
Mockito.when(rankingService.getMttRankingFromRedis(Mockito.any(), Mockito.any())).thenReturn(redisDieUsers.get(i));
Mockito.when(userSngRecordMapper.getUserList(Mockito.any())).thenReturn(userSngs.get(i));
Mockito.when(userSngRecordMapper.updateUserBatch(Mockito.any())).thenReturn(0);
Map<String, String> rankByUserID = redisDieUsers.get(i).stream().collect(Collectors.toMap(MTTRankingVO::getUserID, MTTRankingVO::getRank));
Map<String, Long> powerByUserID = userSngs.get(i).stream().collect(Collectors.toMap(UserSngVO::getUserID, UserSngVO::getPower));
Mockito.when(rocketMQTemplate.syncSend(Mockito.anyString(), Mockito.any(Message.class))).thenAnswer(new Answer<SendResult>() {
@Override
public SendResult answer(InvocationOnMock invocation) throws Throwable {
Message<PowerMQBTO> value = (Message<PowerMQBTO>) invocation.getArguments()[1];
powerByUserID.forEach((k, v) -> {
log.info("----------value:{}={}={},result:{}--------", k, rankByUserID.get(k), v, value.getPayload());
});
return new SendResult();
}
});
powerRankMQListener.onMessage(msgs.get(i));
}
}
}