代码之家  ›  专栏  ›  技术社区  ›  Ondra Žižka David Lilljegren

如何在Spock测试框架中模拟服务类注入?

  •  0
  • Ondra Žižka David Lilljegren  · 技术社区  · 6 年前

    我有一个Java服务,它很少有Guice注入的东西。

    public class RecoveryServiceImpl implements RecoveryService {
        @Inject
        public RecoveryServiceImpl(SessionInstanceCache sessionInstanceCache, AttendeeCache attendeeCache, MessagingStreamConfiguration messagingConfig) {
            this.sessionInstanceCache = sessionInstanceCache;
            this.attendeeCache = attendeeCache;
            this.messagingConfig = messagingConfig;
        }
    
        @Override
        public SessionInstanceData recoverSessionInstance(SessionInstanceDto sessionInstance) {
            SessionInstanceData sessionInstanceData = SessionInstanceHelper.recoverSessionInstance(sessionInstance);
    
            if (sessionInstanceData.getDeepstreamServerKey() == null) {
                String dsKey = SessionInstanceHelper.pickRandomDeepstreamServerKey(
                    sessionInstanceData, messagingConfig);
    

    这样做:

    public static String pickRandomDeepstreamServerKey(
            SessionInstanceData sessionInstanceData, MessagingStreamConfiguration dsConfig) {
        // NPE occurs here
        List<String> dsKeys = new ArrayList(dsConfig.getBaseUrls().keySet()); 
    

    这是用斯波克测试的。 我添加了 messagingConfig 现在我正努力让它在斯波克测试中被嘲笑:

    class RecoveryServiceImplTest extends Specification {
    
    ...
        MessagingStreamConfiguration msgConfig = Mock(MessagingStreamConfiguration);
        RecoveryService recoveryService = new RecoveryServiceImpl(sessionInstanceCache, attendeeCache, msgConfig);
    
        def "Recover session instance"() {
            ...
            def dsMap = new HashMap<String, URL>();
            dsMap.put("ds1", new URL("http://ilovemocking.com/"));
    
            when:
            msgConfig.getBaseUrls() >> dsMap;
            //msgConfig.getBaseUrls().keySet() >> new HashSet(){{add("ds1")}};
            recoveryService.recoverSessionInstance(sessionInstanceDto)
    

    打电话给 recoverSessionInstance() ,我得到一个 NPE 因为 getBaseUrls() 返回空值。

    我尝试了另一种方法,实例化 msgConfig 作为普通对象(也称为“stubing”),但结果相同。

    我该怎么让斯波克假装 dsMap 而不是 null 是吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ondra Žižka David Lilljegren    6 年前

    最后,dependency.jar中缺少方法是个问题(与我所看到的代码相比)NPE来自模拟代理,而不是表达式本身然而,在满是倒影的堆迹中却很难看到。

    我一会儿就删除这个问题。