2014-12-02 13 views
6

Groovy'un yeni özelliklerini Grails Spock testlerimde nasıl uygularım? Her denediğimde, buna benzeyen bir stacktrace alırım. Farkına varamayacağım Groovy parkurlarının bazı sınırlamaları var mı?Grails'de Groovy Trait Kullanılıyor Sınama Başarısız

JDK Versiyon:

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 Sürümünün:

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

Grails Versiyon:

Grails version: 2.4.3 

Basitleştirilmiş Kodu:

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

Nasıl kullanıldığına bağlı olarak değişir. neyin peşinde olduğunu ekleyebilir misin? – dmahapatro

+0

Hangi JVM sürümünü kullandığınızı söyleyebilir misiniz? – melix

cevap

-1

özellikleri kullanmak komut alanları ile bir sınırı olduğunu bana öyle geliyor. Bir özellik kullanan uygulama alanlarının sayısı belirli bir boyuta ulaşırsa (benim durumum 34 yöntem), bu istisna atılır. Şu anda sahip olduğum aynı konuya koşuyorum ve bunu çözmeye çalışıyorum. Burada belirtildiği gibi

-Djava.util.Arrays.useLegacyMergeSort=true 

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

buna 0. sadece dönmez nerede onların GETTER_FIRST_COMPARATOR karşılaştırıcı ile ilgisi var

Ben kullanarak Groovy etrafında elde edebildi 1 ve -1 döndürür, ki bu da bir sözleşme ihlali sözünden kaynaklanıyor.

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

Meslektaşım bir özellik fazla 10 alanları olduğu gibi bu kısa sürede olur öğrendim:

8

aynı istisna özelliklerin ağır kullanır projemize oluşur. Bu davranışın kaynağı bizim için bilinmemektedir.

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

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

Biz ColimMc önerdiği gibi Android böylece JVM seçenekleri ayarlama konusunda Groovy kullanmak dikkat çekicidir bir seçenek değildir: Çözüm olarak

biz özellik miras faydalanmak.

+1

sorunu 10 alanları ile sorunu vardı, bir tane kaldırıldı ve tüm normal tekrar, ilginç bir şey ben bilgisayar yeniden başlatılıncaya kadar her şey tamam oldu – tomasb

+1

Sadece 10 + alanları ile bir özellik ile aynı belirsiz derleyici hatası vurmak - sayıyı azaltma < 10 çözdü - ne garip bir hata (groovy-eclipse derleyici 2.9.2-01, groovy-tüm 2.4.9. –

+0

@TomBunting Bu sorunu bulduğunuz için sevindim ve daha fazla zaman kaybetmedim. garip hata, özellikleri ile çalışırken bulmak son derece zordur. – EightBitBoy