2014-12-02 62 views
6

如何在我的Grails Spock測試中實現Groovy的新特性?每次嘗試時,我都會得到一個看起來像這樣的堆棧跟蹤。有沒有我可能不知道的Groovy路徑的一些限制?在Grails中使用Groovy Trait測試失敗

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

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 2014-12-02 22:09:27

+0

你能告訴我你使用哪個JVM版本嗎? – melix 2014-12-03 13:19:37

回答

-1

在我看來,有與使用特點腳本領域的限制。如果使用特質的實現中的字段數量達到一定的大小(我的情況是34個方法),則拋出此異常。我目前正在遇到同樣的問題,您正在嘗試解決此問題。

我能夠用得到解決的Groovy:

-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!

我的同事發現,這是一個特點具有十多個領域儘快發生。這種行爲的起源對我們來說是未知的。

作爲一種變通方法,我們利用性狀遺傳的:

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

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

值得注意的是,我們使用Groovy的提議ColimMc的Android所以調整JVM選項是不是一種選擇。

+1

有特徵的10個字段的問題,刪除一個,所有都是正常的,有趣的是,一切都好,直到我重新啓動計算機 – tomasb 2015-06-17 09:16:11

+1

只需點擊具有10+字段特徵的完全相同的模糊編譯器錯誤 - 將數字降低到< 10解決了它 - 一個奇怪的錯誤(groovy-eclipse編譯器2.9.2-01,groovy-全部2.4.9。 – 2017-04-28 09:06:27

+0

@TomBunting我很高興你發現這個問題,並沒有浪費更多的時間在這上面。奇怪的錯誤,在處理特質時很難定位。 – EightBitBoy 2017-05-01 18:41:57