2017-04-20 85 views
0

我试图更新常规单元测试和我在用下面的代码的一个问题:斯波克未能拦截方法与可选的参数(一个或多个)

def "getDatasetRecords() returns PaginatedSearchResults with a set of DatasetRecords from the repo"() { 
    setup: 
    def mockRecords = [] 
    def originalResults = Mock(PaginatedSearchResults) 

    def modelMock = Mock(Model) { 
     isEmpty() >> false 
     filter(_ as org.matonto.rdf.api.Resource, _ as IRI, _ as Value, null) >>> it // Also tried (*_), (_, _, _) w&w/o Classes 
    } 

    def recordMock = Mock(DatasetRecord) 
    recordMock.getModel() >> modelMock 

    7.times { mockRecords << recordMock } 
    originalResults.getPage() >> mockRecords 
    originalResults.getPageNumber() >> 1 
    originalResults.getTotalSize() >> 7 
    originalResults.getPageSize() >> 10 
    catalogManagerMock.findRecord(*_) >>> originalResults 

    expect: 
    def results = service.getDatasetRecords(new DatasetPaginatedSearchParams(vf)) 
    results.getPage().size() == 7 
    results.getPageSize() == 10 
    results.getTotalSize() == 7 
    results.getPageNumber() == 1 
} 

当调试代码:它看来,model.filter正在返回nullisEmpty()在这里称为NPE被抛出:

public Optional<DatasetRecord> getExisting(Resource resource, Model model, ValueFactory valueFactory, ValueConverterRegistry valueConverterRegistry) { 
    return (model.filter(resource, valueFactory.createIRI(RDF_TYPE_IRI), this.getTypeIRI()).isEmpty()?Optional.empty():Optional.of(new DatasetRecordImpl(resource, model, valueFactory, valueConverterRegistry))); 
} 

的NPE:

getDatasetRecords() returns PaginatedSearchResults with a set of DatasetRecords from the repo(org.matonto.dataset.impl.SimpleDatasetManagerSpec) Time elapsed: 0.028 sec <<< ERROR! 
java.lang.NullPointerException 
    at org.matonto.dataset.ontology.dataset.DatasetRecordFactory.getExisting(DatasetRecordFactory.java:65) 
    at org.matonto.rdf.orm.AbstractOrmFactory.getExisting(AbstractOrmFactory.java:159) 
    at org.matonto.rdf.orm.AbstractOrmFactory.getExisting(AbstractOrmFactory.java:167) 
    at org.matonto.dataset.pagination.DatasetRecordSearchResults.lambda$new$0(DatasetRecordSearchResults.java:46) 
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) 
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374) 
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) 
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) 
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) 
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) 
    at org.matonto.dataset.pagination.DatasetRecordSearchResults.<init>(DatasetRecordSearchResults.java:47) 
    at org.matonto.dataset.impl.SimpleDatasetManager.getDatasetRecords(SimpleDatasetManager.java:155) 
    at org.matonto.dataset.impl.SimpleDatasetManagerSpec.getDatasetRecords() returns PaginatedSearchResults with a set of DatasetRecords from the repo(SimpleDatasetManagerSpec.groovy:371) 

filter的定义:

Model filter(Resource subject, IRI predicate, Value object, Resource... context); 

我试图充分使用和不使用最后一个参数都蒙上了斑驳为模拟对象的方法签名。任何帮助将不胜感激得到filter方法在这里工作的模拟拦截器。

+0

嘲笑不应该与'expect'一起使用,请使用'when-then-then'。 –

回答

0

试试这个方法:

class Spec extends Specification { 
    def 'mock returns itself'() { 
     given: 
     def mock = Mock(Model) { 
      filter(*_) >> it 
     } 

     expect: 
     mock.filter(1, 2, 3, 4) == mock 
     mock.filter(1, 2, 3) == mock 
    } 
} 

class Model { 
    Model filter(a, b, c, ... d) { 
     new Model() 
    } 
} 
+0

没有为我工作。此外,'Model.filter(a,b,c,... d)'(对于最后的可选参数,Groovy中的语法并不完全确定)。我认为这是最后的可选参数,它干扰了方法模拟。 – NotNormal

+0

@NotNormal,如果你把'GrooyMock'改为'Mock',它应该可以工作。看到这里:http://stackoverflow.com/questions/20808189/spock-mock-a-method-with-varargs – Opal

+0

我开始这样,今天早上回来了。当通过代码进行调试时:我计算表达式'model.filter(resource,valueFactory.createIRI(RDF_TYPE_IRI),this.getTypeIRI())',IntelliJ中的表达式计算器返回java.lang.IllegalArgumentException:无效的参数count:expected 4,收到3',告诉我模拟的拦截器无法处理它。 – NotNormal

0

我的代码(上面)罚款,但一个小的改动是:

def modelMock = Mock(Model) { 
    isEmpty() >> false 
    filter(*_) >> it 
} 

我的问题竟然是的IntelliJ,并试图在那里进行调试。