gpt4 book ai didi

grails - 在 Grails 中使用 Groovy Trait 测试失败

转载 作者:行者123 更新时间:2023-12-02 09:28:46 32 4
gpt4 key购买 nike

如何在我的 Grails Spock 测试中实现 Groovy 的新特征?每次我尝试时,我都会得到如下所示的堆栈跟踪。 Groovy 路径是否存在一些我可能不知道的限制?

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 版本:

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)

最佳答案

同样的异常发生在我们大量使用特征的项目中:

java.lang.IllegalArgumentException:比较方法违反了其一般契约!

我的同事发现,只要特征具有超过 10 个字段,就会发生这种情况。我们不知道这种行为的起源。

作为一种解决方法,我们利用特征继承:

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

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

值得注意的是,我们在 Android 上使用 Groovy,因此按照 ColimMc 的建议调整 JVM 选项不是一个选项。

关于grails - 在 Grails 中使用 Groovy Trait 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259633/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com