微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spring – Mockito注入不适用于构造函数和setter模拟在一起

我有一个类通过构造函数注入成员,其他通过setter注入.我似乎无法让Mockito注入二传手.注入的构造函数被模拟得很好,但是setter的返回为null.当我将setter-ed成员翻转到构造函数注入时,一切都很顺利.这是原始的生产代码

@Autowired
private BetRepository betRepository;

public void setBetRepository(BetRepository betRepository) {
this.betRepository = betRepository;
}


public TournamentScoringCache(TournamentScoringCacheInitializer cacheInitializer,ScoringEngineInitializer scoringEngineInitializer) {
    tournamentUserStates = cacheInitializer.initCache();
    scoringEngines = scoringEngineInitializer.initEngines();
}

public score> void updateGamescore(Long tournamentId,Long gameId,Matchscorescore) {
    Mapnes.get(tournamentId);
    List

测试代码

@Mock
BetRepository betRepository;
@Mock
TournamentScoringCacheInitializer cacheInitializer;
@Mock
ScoringEngineInitializer engineInitializer;

@InjectMocks
private TournamentScoringCacheAndDB tournamentScoringCache;

@Test
public void testUpdateGamescore() {
....        
when(cacheInitializer.initCache()).thenReturn(utss);
    when(betRepository.getBetsByGameId(1L)).thenReturn(createBets());
    when(engineInitializer.initEngines()).thenReturn(createEngines());
    when(engine.getBetscore(bet1,score)).thenReturn(betscore);
    when(engine.getBetscore(bet2,score)).thenReturn(betscore2);

    tournamentScoringCache.updateGamescore(tournamentId,gameId,score);
....
}

有任何想法吗?

谢谢!

最佳答案
是的,@ InjectMocks注释使得Mockito EITHER进行构造函数注入,或者setter / field注入,但是从不这两个.选择的规则非常复杂,这也是我尽量避免使用@InjectMocks的原因之一.

总而言之,Mockito FirsT从类中的那些中选择一个构造函数,然后分析该构造函数是否可用于构造函数注入.它选择的那个将永远是具有最多参数的那个.如果有多个构造函数具有相同数量的参数,则未定义哪个将被选择.

如果CHOSEN构造函数一个或多个参数的类型是基本类型,或最终类或私有类,则不会使用构造函数注入.即使有其他构造函数可以使用.

如果未使用构造函数注入,或者唯一的构造函数认构造函数,则将使用setter / field injection.但是setter / field注入永远不会与构造函数注入一起使用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐