2014-01-28 433 views
2

考慮下面的例子:非打印字符

assertEquals("I am expecting this value on one line.\r\nAnd this value on this line", 
    "I am expecting this value on one line.\nAnd this value on this line"); 

是否有任何調整或插件在Eclipse中\,可以幫助確定額外的「\ r」(或其他非此事字符串比較中的可打印字符?

目前的結果比較並不能真正幫助我找出問題: extra carriage return result comparison

回答

2

對於情況下,斷言必須是「非打印字符」敏感,你可以使用它轉換非打印自定義斷言方法字符與比較之前的Unicode字符表示。這裏是一個用於說明一些快速編寫的代碼(由thisthis啓發):拋出與預期和junit.framework.ComparisonFailure.ComparisonFailure

package org.gbouallet; 

import java.awt.event.KeyEvent; 

import org.junit.Assert; 
import org.junit.Test; 

public class NonPrintableEqualsTest { 

@Test 
public void test() { 
    assertNonPrintableEquals(
      "I am expecting this value on one line.\r\nAnd this value on this line", 
      "I am expecting this value on one line.\nAnd this value on this line"); 
} 

private void assertNonPrintableEquals(String string1, 
     String string2) { 
    Assert.assertEquals(replaceNonPrintable(string1), 
      replaceNonPrintable(string2)); 

} 

public String replaceNonPrintable(String text) { 
    StringBuffer buffer = new StringBuffer(text.length()); 
    for (int i = 0; i < text.length(); i++) { 
     char c = text.charAt(i); 
     if (isPrintableChar(c)) { 
      buffer.append(c); 
     } else { 
      buffer.append(String.format("\\u%04x", (int) c)); 
     } 
    } 
    return buffer.toString(); 
} 

public boolean isPrintableChar(char c) { 
    Character.UnicodeBlock block = Character.UnicodeBlock.of(c); 
    return (!Character.isISOControl(c)) && c != KeyEvent.CHAR_UNDEFINED 
      && block != null && block != Character.UnicodeBlock.SPECIALS; 
} 
} 
+0

這是一個小故障,但仍然不是一個壞主意。然而,改變單元測試數據本身似乎有點有趣,但我明白爲什麼。理想情況下,這樣的東西將被整合到junit插件中。 +1 – javamonkey79

1

你可以寫你自己的斷言方法(不使用任何來自該Assert類的)以顯示不可打印字符的方式轉換的實際值(如@GuyBouallet回答中的replaceNonPrintable(String)方法)。該自定義斷言不能使用Assert.assertEquals(),因爲它會將原始對象(字符串,以您的情況)作爲參數引發異常;你需要拋出異常與輸入的修改版本。

0

首先檢查assertj和hamcrest matchers等其他測試框架。他們有更好的報告部分 - 他們可能具有此功能。

如果不是,那麼: 如果你希望在這個唯一的測試中遇到這個問題,那麼就像@Guy Bouallet說的那樣 - 寫你自己的斷言。但是如果你的應用程序做了很多這種類型的字符串比較,而不是編寫許多不同的斷言(equals/substring/matches等),只需使用字符串規範化。在將字符串傳遞給斷言方法之前,將所有白色字符替換爲其他字符