2017-07-01 10 views
1

文字列を同等のUnicode文字に変換するライブラリを使用しています。問題は、ユニコード値をそれ自身と比較する単体テストを書くとき、両方の値が等しいとしてもテストが失敗することです。文字列のUnicodeへの変換をテストできません

はここに私のコードです:予想通りresultオブジェクトの値が同じ値を保持しているにもかかわらず

@Test 
public void whenTranslate_thenCorrect() { 
    UnicodeEscaper ue = UnicodeEscaper.above(0); 
    String result = ue.translate("ABCD"); 

    Assert.assertEquals("\u0041\u0042\u0043\u0044", result); 
} 

、テストは失敗します。ここに私が得ているトレースはあります:

org.junit.ComparisonFailure: expected:<[ABCD]> but was:<[\u0041\u0042\u0043\u0044]> 
at org.junit.Assert.assertEquals(Assert.java:115) 
at org.junit.Assert.assertEquals(Assert.java:144) 
at com.play.text.UnicodeEscaperTest.whenTranslate_thenCorrect(UnicodeEscaperTest.java:14) 
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:497) 
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.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:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

なぜ翻訳前に同じ値が期待されますか?ソースファイルで

+5

' "\ u0041 \ u0042 \ u0043 \ u0044"' \ u0041 \」に等しくない場合、実行時にプログラムで ' "ABCD" を' '表しますu0042 \ u0043 \ u0044 "。実行時に '\ u0041 \ u0042 \ u0043 \ u0044'の値を必要とする場合は、ソースコード文字列リテラルの\\ u0041 \\ u0042 \\ u0043 \\ u0044" 'でバックスラッシュをエスケープします。 –

+0

それはうまくいきました。ありがとう! –

答えて

0

、あなたが

Assert.assertEquals("\u0041\u0042\u0043\u0044", result); 

を書いた\u0041のようなスニペットはUnicode escapesです。これらは、コンパイラがコードを見る前に、対応するUTF-16コードユニットに認識され、変換されます。言い換えれば、上記のコード行は、最初に実際に

Assert.assertEquals("ABCD", result); 

に翻訳されています。これは、実行時にresultの値と文字列値"ABCD"を比較していることを意味します。しかし、あなたのresult変数は実際にはStringという値を"\u0041\u0042\u0043\u0044"という文字列で参照しています。実行時に構築され、ソースコード内でUnicodeがエスケープされません。

ソースコードでこの値をStringリテラルとして使用する場合は、\をエスケープして、コンパイラが次に続くものをUnicodeエスケープとして解釈しないようにする必要があります。ソースコードの例では

Assert.assertEquals("\\u0041\\u0042\\u0043\\u0044", result); 
+0

問題が発生しましたか? –

+0

いいえ、あなたの答えはいいです。 –

関連する問題