2017-09-20 4 views
0

J'ai une application qui interroge les données EC2 Instance en utilisant AWS SDK d'Amazon pour Java. L'instance est sérialisée à une chaîne JSON à l'aide de la classe wrapper Jackson incluse dans AWS SDK. Plus tard, je suis en mesure d'utiliser la méthode Jackson.fromJsonString(String, Class) pour désérialiser la chaîne JSON dans un objet EC2 Instance.Jackson: "Définitions de setter conflictuelles pour la propriété" dans les tests JUnit

Tout cela fonctionne très bien dans mon code d'application. Cependant, il échoue à chaque fois lorsqu'il est exécuté à partir d'un test JUnit dans Eclipse. J'utilise exactement les mêmes données et le même code de désérialisation. Quand je le lance à partir d'un test JUnit, cependant, je reçois l'exception suivante:

com.amazonaws.SdkClientException: Unable to parse Json String. 
    at com.amazonaws.util.json.Jackson.fromJsonString(Jackson.java:66) 
    at com.myapp.filters.test.AbstractResourceFilterCriteriaTest.testMeetsCriteria_Fail(AbstractResourceFilterCriteriaTest.java:166) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "instanceType": com.amazonaws.services.ec2.model.Instance#setInstanceType(1 params) vs com.amazonaws.services.ec2.model.Instance#setInstanceType(1 params) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) 
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:461) 
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3838) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3732) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2726) 
    at com.amazonaws.util.json.Jackson.fromJsonString(Jackson.java:64) 
    ... 26 more 
Caused by: java.lang.IllegalArgumentException: Conflicting setter definitions for property "instanceType": com.amazonaws.services.ec2.model.Instance#setInstanceType(1 params) vs com.amazonaws.services.ec2.model.Instance#setInstanceType(1 params) 
    at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:300) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.filterBeanProps(BeanDeserializerFactory.java:619) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:515) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:256) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:169) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) 
    ... 33 more 

Toute idée sur la terre pourrait aller mal ici? Pourquoi est-ce que cela fonctionne très bien dans le code de l'application principale, mais échoue lorsqu'il est exécuté en tant que test JUnit? Comme je ne possède pas l'objet Instance (cela fait partie du SDK d'Amazon), je ne peux pas modifier les annotations de Jackson. Une idée de comment je peux contourner cela pour mes tests unitaires?

+1

En regardant les sources ['Instance'] (http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/Instance.html) il y a 2' setInstanceType 'méthodes, une avec un argument' String' et une avec un argument enum 'InstanceType', ce qui pourrait expliquer la confusion. Si vous savez lequel est utilisé, alors vous pouvez essayer d'ignorer l'autre en utilisant un mixin (comme [ici] (https://github.com/FasterXML/jackson-databind/issues/1251)). Quant à savoir pourquoi cela se produit, je ne peux penser à une différence de chemin de classe entre les 2 processus, mais je ne peux pas vraiment mettre un doigt dessus ... – Morfic

+0

@Morfic +1 [JacksonMixInAnnotations] (https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations) peut probablement aider – varren

Répondre

2

Je dirais que vous avez un problème de version avec le SDK entre les tests et la production. En regardant leur code source pour cette classe:

https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-ec2/src/main/java/com/amazonaws/services/ec2/model/Instance.java

Ils semblent avoir une annotation pour jackson sur l'un des deux setters, en précisant que c'est celui à utiliser pour la sérialisation/désérialisation. Ceci est la dernière version, je n'ai pas de retour dans l'histoire pour voir si l'ancienne version manquait cela.

+0

Je cours le code d'application et les tests de JUnit sur mon poste de travail de développement. Même JDK, même SDK AWS, même chose (du mieux que je puisse dire). Mais, exécuter le même bloc de code dans le cadre de l'application (lancer une action JSF, par exemple) fonctionne, mais mon test JUnit échoue. – Shadowman

+0

Comparez les chemins de classe complets - Si vous lancez l'application et les tests unitaires à partir de votre IDE, l'EDI devrait afficher dans la console la commande java qui déclenche les choses, et cela devrait avoir des chemins de classes complets. Enregistrer cela pour les deux et faire une comparaison. Je m'attendrais à quelques différences pour les dépendances de test comme junit - mais si vous voyez des différences liées à Jackson ou AWS ce serait la clé. Si vous êtes maven, les différences de fluidité sont communes si le fichier POM ne verrouille pas une version. –

+0

J'utilise Maven pour la gestion des dépendances. Mes fichiers POM mentionnent explicitement une version. Toujours aucune idée de ce qui pourrait se passer ici. – Shadowman