2016-09-11 10 views
2

私はJsonMarshall(T t)というメソッドを持っています。このメソッドはオブジェクトをとり、それをJson Stringに変換します。このメソッド内で、私は、このタスクを達成するためにObjectmapperを使用しています:今きれいな印刷が可能なJsonMarshallerのユニットテスト方法は?

mapper.writerWithDefaultPrettyPrinter().writeValueAsString(t) 

を、私は私のテストのために使っていた属性のタイトルと名前を持つクラスClientNameを持って言うことができます。

  1. テスト失敗:私は2つのシナリオを取得

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

    :今、私は私の方法でJSON文字列にClientNameを変換し、いくつかに対して、その出力をアサートすることにより、このメソッドをテストしようとしたときのようなJSON文字列を期待しました私の方法でmapper.writerWithDefaultPrettyPrinter().writeValueAsString(t)を使用したとき。私はmapper.writeValueAsString(t)

を行うので、私はwriterWithDefaultPrettyPrinter()のインデントがテストの失敗の原因となっていると思うとき

  • テストは合格します。

    最初のシナリオでこのテストに合格する方法はありますか?

  • 答えて

    1

    出力がきれいに印刷され、改行や空白などの追加の書式記号が含まれているため、最初のテストが失敗したとします。あなたは何ができるか

    1. ちょうど最初のテストメソッド内の別の予測文字列を使用します。
    2. テスト中のメソッドの戻り文字列を解析し、テストメソッドに逆シリアル化されたオブジェクトを使用します。
    3. あなたのテストにはJsonPathlibを使用できます(XPathと同じように動作します)。 JsonPathResultMatcherを使用して、Spring Frameworkに基づいてRESTful Webサービスをテストします。 @パトリック完全に合理的なオプションに代わるものとして
    +0

    これら3つのうち、(2)または(3)のいずれかを選択します。最初の問題の問題は、 "かわいい"文字列の外観が変わる可能性があることです(たとえば、あるバージョンではインデントが3つのスペースになり、新しいバージョンではインデントが4つのスペースに変更されます)属性変更の)、それはあなたの単体テストを破るだろう。 *正確な外観が重要でない限り、特定の固定文字列に対するテストは避けてください。 – dcsohl

    1

    、私は、第四の選択肢をお勧めしたい:あなたはJMockit、MockitoまたはEasymockのようなツールでObjectmapperを模擬し、単にあなたのJsonMarshall方法は、適切なメソッドを呼び出すことを確認することができますObjectmapperに記載されています。

    これは、もちろん、あなたがmapper.writerWithDefaultPrettyPrinter().writeValueAsString()は、それはあなたが何をしたいかであることをを行うことになっているものないという疑いを持っていないことを前提としています。これらの条件のいずれかについて疑問がある場合は、少なくとも今のところ、嘲笑しないのが最善でしょう。

    関連する問題