如何在扩展 Spock 规范的 Groovy class 中模拟 Java 可选 Class

How to Mock Java Optional Class in Groovy class which Extends Spock Specification

我有一个非常简单的 Spring 休息服务。下面是我在 Java 中的 ServiceImpl Class :-

  1. 服务实施Class =>
    @AllArgsConstructor(onConstructor = (@__(@Autowired)))
    public Class ServiceImpl implements ServiceClass {
    
    
        private ServiceRepository repo;
        private MapstructRequestMapper1 mapper1;
    
    
        private Optional<Pojo1> pojo1;
    
        @Override
        public Optional<Pojo1> getSomething(Pojo2 pojo2, String someString){ return repository.findById(Id)};
    
        @Override
        public SomeResponse createSomething(Pojo2 pojo2, String someString){
    
            pojo1 = getSomething(someString); //This Returns an Optional object.
    
            if(pojo1.ifPresent(pojo1-> {
    
                    //set something with pojo1's attributes and then do something.
    
            });
            )
    
        }
    
    }
    
    
    
  2. Impltest class:-(使用 Groovy + Spock 规范)

    def ref = Mock(Servicerepo)
    def mapperRef1 = Mock(MapstructRequestMapper1)
    //This is where I am stuck

    def requestTestObj = Mock(Pojo1)

    def service = new ServiceImpl(ref,mapperRef1, requestTestObj) //This is where it fails.

    def "myTest - some bla" () {

    }


}

ERROR => 如果我尝试 def requestTestObj = Mock(Pojo1) as Optional 它会给我以下 2 个错误:-

  1. Class无法施放
  2. 如果没有 "as Optional" 它会给我 "No Matching Constructor in the ImplTestclass".

我们如何处理这个问题?这里使用的DB是Mongo

谢谢。

您不能通过常规方式直接模拟 class Optional,因为 class 是最终的并且 Spock 模拟基于动态代理,即 sub-classing。但是模拟 Pojo1 并将其包装成 Optional 怎么样?

def requestTestObj = Mock(Pojo1)
def service = new ServiceImpl(ref, mapperRef1, Optional.of(requestTestObj))

像往常一样,您可以对 POJO 的方法进行存根,验证某些方法是否已被调用多次等等。