2017-09-14 14 views
1

サービスにJSONドキュメントを送信するWebサービスクライアント用のJUnitテストを作成しました。assertEqualsを使用して比較した場合、等しいと予想される等しいJSON文字列

"正しい" JSONドキュメントをファイルに保存した後、テスト実行後に実際の結果と比較します。

ラインが同一であるが、彼らは、一致していない:

org.junit.ComparisonFailure: 
    Expected :{"Callback":null,"Data": 
    {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}} 
    Actual :{"Callback":null,"Data": 
    {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}} 

線を約4K文字、非常に長いので、私はここにそれの多くをカットしますが、その長さは同じです。私はデバッガでstring.size()を比較し、また比較の前にトリムして、暗黙のうちに挿入できるテキストエディタの最後にある見えない記号や空白の記号を削除しました。

また、単独で実行するとテストは正常です。しかし、それは大きなスイートの一部として実行すると失敗します。

グローバル/静的変数がないため、メモリオーバーライドは問題ではありません。 私はこのように、要求文字列を抽出するために、Webサービスクライアントをからかっている:

StringBuilder pd = new StringBuilder(); 
doAnswer((invocation) -> { 
    String postDocument = ((String)invocation.getArguments()[0]).trim(); 
    pd.append(postDocument); 
    return null; 
}).when(client).doPost(anyString(), anyObject()); 

クライアントが嘲笑クラスです。

は、それから私は、文字列のトリミングされたバージョンを比較し、それは私が問題はJSONの仕様自体である :-)自分自身に答える見つけ

String expectedSubmit = TestUtils.readXmlFromFile("strategyexecution\\ireland_bm_strategy_override_expected.json").trim(); 
assertEquals(expectedSubmit, pd.toString().trim()); 
+0

エンコードに問題はありますか?実際のバイトが同じかどうかを調べるには、文字列とファイルを別々に書き出し、md5またはsha1のチェックサムを使用してみることもできます。 – inovaovao

+4

投稿する[mcve] 'assertEquals'は壊れていません –

+0

Jenkins envでうまく動作します。 IntelliJ IDEAのバグのように見えます。 IDEAでのみ失敗し、スイート全体(1つのクラスファイル内の独立したテストではない)が実行されたときにのみ失敗します –

答えて

1

を助けるdoesntの。 JSONは配列内の要素の順序を保証することはできません。基本的に順序付けされていません。 したがって、コンテンツをランダムに並べ替えることができます。生成された2つのJSONファイルを2つの文字列として比較するべきではありません。

私はそれをJavaオブジェクトとオブジェクトの比較作業にデシリアライズしました!

0

XMLと同じ古い問題です。 XMLの場合、XMLUnitです。意味的に xml-sを比較します。 JSONについては、JsoNunitのような同様のツールを使用しようとしています。 JSONAssertも有望です。

関連する問題