2014-12-02 4 views
6

मैं अपने ग्रेल्स स्पॉक परीक्षणों में ग्रोवी के नए लक्षण कैसे कार्यान्वित कर सकता हूं? हर बार जब मैं कोशिश करता हूं, मुझे ऐसा लगता है कि एक ऐसा स्टैकट्रैक मिलता है। क्या ग्रोवी ट्रेल्स की कुछ सीमा है जिसे मुझे पता नहीं हो सकता है?ग्रेल्स टेस्ट में ग्रोवी ट्राइट का उपयोग करना

JDK संस्करण:

java version "1.7.0_65" 
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1) 
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) 

ग्रूवी संस्करण:

Groovy Version: 2.3.6 JVM: 1.7.0_65 Vendor: Oracle Corporation OS: Linux 

Grails संस्करण:

Grails version: 2.4.3 

सरलीकृत कोड:

import grails.test.mixin.Mock 
@Mock([AnalyticFilters]) 
trait ControllerTestBase { 
public void setupCommonStuff(boolean setupIdCall = false) { 
params.devId = TEST_DEV_ID 
    // mocking version filter 
    params.version = "v${TEST_VERSION}" 

    defineBeans{ 
     CacheService(cacheServiceMock: "createMock") 
    } 

    CommonParams.parseParams(params) 

    cacheMock = applicationContext.getBean("cacheServiceMock") 

    if(setupStoreIdCall) { 
     cacheMock.demandExplicit.makeCompositeKey(0..20) { List<String> list -> 
      def (String uuid, String orgUuid) = list 
      return "foobar" 
     } 
    } 

} 
} 

@TestFor(AuditController) 
public class AuditControllerSpecs extends Specification implements ControllerTestBase { 

private def auditServiceFactory 

public String testAuditData = "{audit:'whatever'}" 

public void setup() { 
    setupCommonParams() 

    defineBeans { 
     auditServiceFactory(GrailsMock, AuditService) 
     auditService(auditServiceFactory: "createMock") 
    } 
    auditServiceFactory = applicationContext.getBean("auditServiceFactory") 
    auditServiceFactory.demand.writeEventToMongo { BasicDBObject data -> } 
    controller.auditService = applicationContext.getBean('auditService', AuditService) 
} 

def "calling productAudit should return with 200 and OK"() { 

    given: 
    request.JSON = JSON.parse(testAuditData) 
    request.method = 'POST' 
    when: 
    withFilters(action: "productAudit") { 
     controller.productAudit() 
    } 
    then: 

    def res = JSON.parse(response.text) 

    expect: 
    response.status == 200 
    res.message == "OK" 
    100 == 2 
} 

}

स्टैकट्रेस: ​​

[groovyc] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
    [groovyc] General error during canonicalization: Comparison method violates its general contract! 
    [groovyc] 
    [groovyc] java.lang.IllegalArgumentException: Comparison method violates its general contract! 
    [groovyc]  at java.util.TimSort.mergeLo(TimSort.java:747) 
    [groovyc]  at java.util.TimSort.mergeAt(TimSort.java:483) 
    [groovyc]  at java.util.TimSort.mergeCollapse(TimSort.java:410) 
    [groovyc]  at java.util.TimSort.sort(TimSort.java:214) 
    [groovyc]  at java.util.TimSort.sort(TimSort.java:173) 
    [groovyc]  at java.util.Arrays.sort(Arrays.java:659) 
    [groovyc]  at java.util.Collections.sort(Collections.java:217) 
    [groovyc]  at org.codehaus.groovy.transform.trait.TraitComposer.applyTrait(TraitComposer.java:183) 
    [groovyc]  at org.codehaus.groovy.transform.trait.TraitComposer.doExtendTraits(TraitComposer.java:105) 
    [groovyc]  at org.codehaus.groovy.control.CompilationUnit$4.call(CompilationUnit.java:188) 
    [groovyc]  at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1047) 
    [groovyc]  at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:583) 
    [groovyc]  at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:561) 
    [groovyc]  at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:538) 
    [groovyc]  at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:517) 
    [groovyc]  at org.codehaus.groovy.tools.FileSystemCompiler.compile(FileSystemCompiler.java:59) 
    [groovyc]  at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:215) 
    [groovyc]  at org.codehaus.groovy.ant.Groovyc.runCompiler(Groovyc.java:1104) 
    [groovyc]  at org.codehaus.groovy.ant.Groovyc.compile(Groovyc.java:1155) 
    [groovyc]  at org.codehaus.groovy.grails.compiler.Grailsc.compile(Grailsc.java:78) 
    [groovyc]  at org.codehaus.groovy.ant.Groovyc.execute(Groovyc.java:770) 
    [groovyc]  at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    [groovyc]  at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) 
    [groovyc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    [groovyc]  at java.lang.reflect.Method.invoke(Method.java:606) 
    [groovyc]  at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    [groovyc]  at groovy.util.AntBuilder.performTask(AntBuilder.java:319) 
    [groovyc]  at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:264) 
    [groovyc]  at groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:147) 
    [groovyc]  at groovy.util.AntBuilder.doInvokeMethod(AntBuilder.java:203) 
    [groovyc]  at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64) 
+0

इस पर निर्भर करता है कि इसका उपयोग कैसे किया जा रहा है। क्या आप जोड़ सकते हैं आप क्या कर रहे हैं? – dmahapatro

+0

क्या आप मुझे बता सकते हैं कि आप किस जेवीएम संस्करण का उपयोग करते हैं? – melix

उत्तर

-1

मुझे ऐसा लगता है स्क्रिप्ट फ़ील्ड लक्षण का उपयोग के साथ एक सीमा है। यदि एक विशेषता का उपयोग कर रहे कार्यान्वयन से खेतों की संख्या एक निश्चित आकार तक पहुंच जाती है (मेरे मामले 34 विधियों) तो यह अपवाद फेंक दिया जाता है। मैं वर्तमान में आपके पास इस मुद्दे पर चल रहा हूं और मैं इसे हल करने की कोशिश कर रहा हूं। यहाँ उल्लेख किया

-Djava.util.Arrays.useLegacyMergeSort=true 

: https://stackoverflow.com/a/13575810/1673785

मुझे लगता है कि यह उनके GETTER_FIRST_COMPARATOR तुलनित्र के साथ क्या करना है, जहां यह 0. यह केवल वापस नहीं करता है

मैं का उपयोग करके ग्रूवी के आसपास प्राप्त करने में सक्षम था 1 और -1 देता है जो मुझे लगता है कि यह अनुबंध उल्लंघन का उल्लेख क्यों करता है।

8

एक ही अपवाद हमारी परियोजना जो लक्षण का गहन उपयोग करता में होता है:

java.lang.IllegalArgumentException: Comparison method violates its general contract!

मेरे सहयोगी पता चला के रूप में एक विशेषता 10 से अधिक क्षेत्रों है कि इस रूप में जल्द ही होता है। इस व्यवहार की उत्पत्ति हमारे लिए अज्ञात है।

समाधान के लिए हम विशेषता विरासत का इस्तेमाल करते हैं:

trait Foo extends MoreFoo { 
    //this has 10 fields 
} 

trait MoreFoo{ 
    //this has some more fields but not more than 10 
} 

यह उल्लेखनीय है कि हम पर Android इसलिए JVM विकल्प के रूप में ColimMc द्वारा प्रस्तावित का समायोजन ग्रूवी का उपयोग एक विकल्प नहीं है।

+1

में 10 फ़ील्ड के साथ समस्या थी, एक हटा दिया गया और सब कुछ सामान्य था, दिलचस्प बात यह है कि जब तक मैंने कंप्यूटर को पुनरारंभ नहीं किया तब तक ठीक है – tomasb

+1

बस 10+ फ़ील्ड के साथ एक विशेषता के साथ सटीक एक ही अस्पष्ट संकलक त्रुटि को दबाएं - संख्या को कम करके < 10 इसे हल किया - क्या एक अजीब त्रुटि (groovy-eclipse compiler 2.9.2-01, groovy-all 2.4.9। –

+0

@ टॉमबंटिंग मुझे खुशी है कि आपको यह समस्या मिली और इस पर अधिक समय बर्बाद नहीं किया। यह वास्तव में एक है अजीब त्रुटि, लक्षणों के साथ काम करते समय पता लगाना बेहद मुश्किल है। – EightBitBoy

संबंधित मुद्दे