当前位置: 首页 > 知识库问答 >
问题:

Mockito注入不适用于构造函数和setter模拟

郑晗日
2023-03-14
@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 <T extends SideScore> void updateGameScore(Long tournamentId, Long gameId, MatchScore<T> score) {
    Map<Long, UserTournamentState> userStates = tournamentUserStates.get(tournamentId);
    ScoringEngine<?> scoringEngine = scoringEngines.get(tournamentId);
    List<Bet> bets = betRepository.getBetsByGameId(gameId);  //HERE IS WHERE I GET THE NPE
....
}
@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);
....
}

谢了!

共有1个答案

云镜
2023-03-14

是的,@injectmocks注释使Mockito要么执行构造函数注入,要么执行setter/field注入,但不能同时执行两者。选择的规则相当复杂,这也是我尽可能避免使用@injectmocks的原因之一。

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

如果所选构造函数的一个或多个参数的类型是基元类型、最终类或私有类,则不使用构造函数注入。即使可以使用其他构造函数。

 类似资料:
  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 我是Spring框架的新手。我试图用注入方法(Setter和构造函数)注入依赖关系。我期待在 setter 注入中定义的输出,因为它被构造函数注入覆盖。但是,我收到了如下错误消息 Bean创建异常:未找到默认构造函数 如果我们同时应用两种注入方法,会不会出错?

  • 问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。

  • 我的应用程序正在部署到IBM WebSphere上。我有一个简单的服务,我想知道依赖注入在这种情况下是如何工作的。 它失败,出现以下错误: [错误]CWWKZ0002E:启动应用程序my app时发生异常。例外消息是:com。国际商用机器公司ws。容器服务状态StateChangeException:com。国际商用机器公司ws。cdi。CDIException:com。国际商用机器公司wsspi

  • 我有一个带有私有构造函数的单例类,我想为此编写单元测试。 如何使用mockito框架模拟具有私有构造函数的类。 谢谢

  • 我有一个DummyResources类和一个DummyTarget文件,以及一个测试类TestDummyResources,如下所示,但是mocked对象仅在我调用普通类中的构造函数时才有效,当它在匿名类中调用时,它调用实际的构造函数而不是使用mocked对象。 版本: powermock 1.4.12 mockito 1.9.0 junit 4.8.2 DummyTarget。java: Dum