2013-07-12 2 views
1

Pourquoi ce scénario de test lance-t-il l'exception "Le noeud n'est pas véridique" même si sa taille est 1?groovy - pourquoi jackson ObjectNode n'est pas véridique?

package foo.bar 

import grails.test.* 

import org.codehaus.jackson.JsonFactory 
import org.codehaus.jackson.JsonNode 
import org.codehaus.jackson.map.ObjectMapper 
import org.junit.Test 

class MyTest{ 
    @Test 
    void testJSonNode() { 
     ObjectMapper mapper = new ObjectMapper(new JsonFactory()) 
     JsonNode node = mapper.readTree('{"foo":"bar"}') 

     assert node.size() == 1 
     assert node.iterator().hasNext() == true 

     if (!node) { 
      throw new Exception("Node is not truthful") 
     } 
    } 
} 

Quelques informations de fond:

  1. L'exception n'est pas levée si je change if (!node) à if (node == null)
  2. Je suppose que cela est un problème avec Groovy Truth
  3. noeud
  4. est une instance de org.codehaus.jackson.node.ObjectNode
  5. Cela avait l'habitude de travailler dans org.codehaus.jackson: jackson-mapper-asl: 1.6.5
  6. Je vois cette question dans org.codehaus.jackson: jackson-mappeur-asl: 1.9.11
  7. ObjectNode implémente Iterable

Répondre

3

JsonNode semble définir un asBoolean() method si Groovy appellera ceci pour déterminer le Groovy valeur -ruth de l'objet plutôt que d'utiliser le test général != null. Cette méthode prétend être nouvelle en 1.9, ce qui explique pourquoi le comportement aurait été différent en 1.6.5.

+0

La page du wiki de vérité groovy ne mentionne pas asBoolean(). Existe-t-il d'autres méthodes/interfaces qui peuvent contribuer à une vérité groovy en dehors de celles mentionnées sur le wiki de la vérité groovy? –

+0

@uklance depuis Groovy 1.7 tout est géré par 'asBoolean' - le GDK ajoute une méthode' asBoolean' à 'Object',' CharSequence', 'Iterator',' Collection', 'Map' et' Object [] 'qui implémente la logique décrite dans cette page wiki, mais n'importe quelle autre classe peut fournir la sienne. –

+0

Merci @ ian-roberts. Ce fut un vrai gratte-tête pour moi –

Questions connexes