2014-12-02 6 views
6

Wie kann ich Groovys neue Eigenschaften in meinen Grails Spock-Tests implementieren? Jedes Mal, wenn ich es versuche, bekomme ich einen Stacktrace, der so aussieht. Gibt es Einschränkungen bei Groovy-Trails, die mir vielleicht nicht bewusst sind?Verwendung der Groovy-Eigenschaft im Grails-Test schlägt fehl

JDK Version:

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 Verison:

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

Grails Version:

Grails version: 2.4.3 

Vereinfachte Code:

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 
} 

}

Stacktrace:

[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

Hängt davon ab, wie es verwendet wird. Kannst du hinzufügen, was hast du vor? – dmahapatro

+0

Können Sie mir sagen, welche JVM-Version Sie verwenden? – melix

Antwort

-1

Es scheint mir, dass es eine Grenze mit Skript Feldern ist, die Züge benutzen. Wenn die Anzahl der Felder aus der Implementierung, die ein Merkmal verwendet, eine bestimmte Größe erreicht (meine Fall 34 Methoden), wird diese Ausnahme ausgelöst. Ich stoße gerade auf dasselbe Problem, das Sie haben, und ich versuche es zu lösen.

konnte ich um Groovy zu erhalten, indem mit:

-Djava.util.Arrays.useLegacyMergeSort=true 

wie hier erwähnt: https://stackoverflow.com/a/13575810/1673785

Ich denke, es mit ihren GETTER_FIRST_COMPARATOR Komparator zu tun hat, wo es nicht 0. Es ist nur zurück gibt 1 und -1 zurück, was meiner Meinung nach der Grund für die Verletzung eines Vertrags ist.

8

Die gleiche Ausnahme tritt in unserem Projekt die starke Nutzung von Eigenschaften macht:

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

Mein Kollege fand heraus, dass dies so schnell geschieht, als ein Merkmal mehr als 10 Felder hat. Der Ursprung dieses Verhaltens ist uns unbekannt.

Als Abhilfe können wir die Verwendung von Merkmal Vererbung machen:

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

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

Es ist bemerkenswert, dass wir Groovy verwenden, um auf Android so JVM-Optionen einzustellen, wie durch ColimMc vorgeschlagen wird, ist keine Option.

+1

hatte das Problem mit 10 Felder in Merkmal, entfernt eins und alles war wieder normal, interessante Sache ist alles in Ordnung, bis ich Computer neu gestartet – tomasb

+1

Genau den gleichen mehrdeutigen Compilerfehler mit einem Merkmal mit 10+ Felder - Senkung der Zahl auf < 10 löste es - was für ein seltsamer Fehler (groovy-eclipse Compiler 2.9.2-01, groovy-all 2.4.9. –

+0

@ TomBunting Ich bin froh, dass Sie dieses Problem gefunden haben und nicht mehr Zeit verschwenden. Dies ist in der Tat ein seltsamer Fehler, es ist extrem schwierig zu finden, wenn man mit Eigenschaften arbeitet. – EightBitBoy

Verwandte Themen