如何在扩展 Spock 规范的 Groovy class 中模拟 Java 可选 Class
How to Mock Java Optional Class in Groovy class which Extends Spock Specification
我有一个非常简单的 Spring 休息服务。下面是我在 Java 中的 ServiceImpl Class :-
- 服务实施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.
});
)
}
}
- 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 个错误:-
- Class无法施放
- 如果没有 "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 的方法进行存根,验证某些方法是否已被调用多次等等。
我有一个非常简单的 Spring 休息服务。下面是我在 Java 中的 ServiceImpl Class :-
- 服务实施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. }); ) } }
- 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 个错误:-
- Class无法施放
- 如果没有 "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 的方法进行存根,验证某些方法是否已被调用多次等等。