2016-09-11 1 views
2

J'ai une méthode appelée JsonMarshall(T t) qui prend un objet et le convertit en chaîne JSON. A l'intérieur de cette méthode que je utilise la Objectmapper pour accomplir cette tâche:Comment tester JsonMarshaller avec un joli print activé?

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(t) 

Maintenant, disons que j'ai une classe ClientName avec les attributs titre et le nom que j'utilise pour mon test. Maintenant, lorsque je tente de convertir ClientName en chaîne JSON avec ma méthode et de tester cette méthode en affirmant sa sortie contre une chaîne JSON classiques tels que:

expectedString = "{\"title\":\"RandomTitle",\"Name\":\"RandomName\"}" 

Je reçois deux scénarios:

  1. test échoue quand j'utilise mapper.writerWithDefaultPrettyPrinter().writeValueAsString(t) dans ma méthode.

  2. test passe quand je ne fais mapper.writeValueAsString(t)

donc je suppose que l'empreinte du writerWithDefaultPrettyPrinter() provoque l'échec du test.

Des idées comment je peux faire passer ce test pour le premier scénario?

Répondre

1

Je suppose que le premier test échoue car la sortie est assez imprimée et contient des signes de format supplémentaires tels que des sauts de ligne et des espaces.

Qu'est-ce que vous pourriez faire:

  1. utiliser Juste une autre chaîne attendue dans la première méthode d'essai.
  2. Analyser la chaîne de retour de votre méthode testée et utiliser l'objet désérialisé pour la méthode de test.
  3. Vous pouvez utiliser un JsonPathlib pour votre test (Fonctionne comme XPath). J'utilise JsonPathResultMatcher pour tester RESTful Webservices basé sur Spring Framework.
+0

Parmi ces trois, j'irais pour (2) ou (3). Le problème avec le premier est que l'apparence de la chaîne "pretty-print" pourrait changer (par exemple, dans une version l'indentation peut être trois espaces et dans une nouvelle version l'indentation est changée en quatre espaces - ou peut-être l'ordre des changements d'attributs), et cela casserait votre test unitaire. A moins que l'aspect * exact * soit important, j'éviterais de tester sur une chaîne fixe particulière. – dcsohl

1

Comme alternative à @ Patrick d'options parfaitement raisonnables, je vous suggère un quatrième choix: Vous pouvez railler l'Objectmapper avec un outil comme JMockit, Mockito ou easymock, et assurez-vous simplement que votre méthode JsonMarshall appelle la méthode appropriée (s) au Objectmapper. Ceci, bien sûr, suppose que vous n'avez aucun doute que mapper.writerWithDefaultPrettyPrinter().writeValueAsString() fait ce qu'il est censé faire et que c'est ce que vous voulez faire. Si vous avez des doutes sur l'une ou l'autre de ces conditions, il serait préférable de ne pas se moquer, au moins pour l'instant.