Using Groovy Trait in Grails Test Fails

How can I implement Groovy new features in Grails Spock tests? Every time I try, I get a stack that looks like this. Is there a restriction on Groovy tracks that I might not be aware of?

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 

Simplified 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) 
+6
source share
2 answers

The same exception occurs in our project, which makes heavy use of features:

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

My colleague found out that this happens as soon as a trait has more than 10 fields . The origin of this behavior is unknown to us.

As a workaround, we use attribute inheritance:

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

It should be noted that we use Groovy on Android, so the JVM settings proposed by ColimMc are not an option.

+8
source

It seems to me that there is a limit with script fields that use traits. If the number of implementation fields using the attribute reaches a certain size (my method is 34 cases), then this exception will be thrown. I am now facing the same problem as mine, and I am trying to solve it.

I managed to get around Groovy using:

 -Djava.util.Arrays.useLegacyMergeSort=true 

as stated here: fooobar.com/questions/14172 / ...

I think this is due to their comparator GETTER_FIRST_COMPARATOR, where it does not return 0. It returns only 1 and -1, which, in my opinion, is the reason that it mentions a breach of contract.

-1
source

Source: https://habr.com/ru/post/979015/


All Articles