2017-11-09 6 views
1

HTMLをXMLに解析し、HTMLからのすべてがXMLファイルにあることを検証する必要があるので、検証のためにUnittestsでHamcrestを使用します。 XMLファイルに多かれ少なかれ情報を含めることはできませんので、containsではなくequalToを使用する正規表現が重要です。問題は解析するが、外部管理されたデータモデルでは許可されていない特定の要素を抽出する必要があるということです。そのようなmigthを行うと、いくつかの場合に余分な空白が追加されることが分かりました(Jsoupと関係があります)。HamCrest isEqualIgnoringWhitespaceが空白を無視しない

スペースが実際のコンテンツには関係しないので、私たちは今のところそれを無視することにしました(純粋にPoCなので)。これを行うために、改行とタブを取り除くすべての空白(\ String.replaceAll("\\s",""))を取り除くソリューションを考え出しました。すべてのテキストは、1つのStringオブジェクトに連結され、ひどい読み取りになります。また、まったくデバッグすることもできません。代わりに、私はHamcrests IsEqualIgnoringWhitespaceを使用することを選択しました。テストすると、名前のように何もしないことが分かった。コードでは、空白、タブ、改行の削除はありませんが、現在の文字が空白かどうかをチェックし、空白の場合はその前の文字にも空白が含まれているかどうかを確認します。その場合、1つの空白が削除されます。したがって、基本的には空白を2つの単語の間に1つだけ含めるように正規化します。だから、本質的にはそれがすべて空白を無視しない

public String stripSpace(String toBeStripped) { 
    final StringBuilder result = new StringBuilder(); 
    boolean lastWasSpace = true; 
    for (int i = 0; i < toBeStripped.length(); i++) { 
     char c = toBeStripped.charAt(i); 
     if (isWhitespace(c)) { 
      if (!lastWasSpace) { 
       result.append(' '); 
      } 
      lastWasSpace = true; 
     } else { 
      result.append(c); 
      lastWasSpace = false; 
     } 
    } 
    return result.toString().trim(); 
} 

:ここ

は、クラスで使用stripSpaceメソッドのコードです。それはなぜこのような名前ですか?私たちはここで互いに一致させたい入力のいくつかの例を与えるために

は空白を持っていますが(テキストはオランダ語であるが、これは問題ではありません)いけないテキストの一部です:

m2m 2(元のHTML:m<sup>2</sup>

Tabel 3.1Tabel 3 .1(HTML元:Tabel <a href="link to table">3</a>.1)これらのテキストよう

は、通常equalToマッチャーによって一致することはありませんは実際には名前に基づいてこれと一致する必要がありますが、一致しません。

実際に空白を無視するマッチャーが実際に存在するかどうか分かりますか? Javadoc IsEqualIgnoringWhitespaceによれば

答えて

2

は空白差は(ほとんど)は無視されたときに調べた文字列が、指定されたexpectedStringと等しいときに一致する文字列のマッチングを作成します。

これはMatchersのJavadocでより詳細に説明される:

は空白差は(ほとんど)は無視されたときに調べた文字列が、指定されたexpectedStringと等しいときに一致する文字列のマッチングを作成します。正確には、次の空白のルールが適用される:

  • expectedString及び検査文字列の両方のすべての先頭と末尾の空白を
  • 残りの空白を無視している、いずれかの文字列内に現れる、単一に折りたたまれ

    @Test 
    public void testIsEqualIgnoringWhitespace() { 
        // leading and trailing spaces are ignored 
        assertThat("m 2", equalToIgnoringWhiteSpace(" m 2 ")); 
    
        // all other spaces are collapsed to a single space 
        assertThat("m 2", equalToIgnoringWhiteSpace("m  2")); 
    
        // does not match because the single space in the expected string is not collapsed any further 
        assertThat("m2", not(equalToIgnoringWhiteSpace("m 2"))); 
    } 
    
    :比較の前に
    スペースが

次のテストでは、この動作を検証します

これは、質問に記載されている動作が表示される理由を説明しています。この再

実際に実際に空白を無視し、整合がある場合は、あなたの誰もが知っていますが?

独自のマッチャーを書くことができます。ここでは例です:次のテストこの正規表現を使用して

public class IgnoresAllWhitespacesMatcher extends BaseMatcher<String> { 
    public String expected; 

    public static IgnoresAllWhitespacesMatcher ignoresAllWhitespaces(String expected) { 
     return new IgnoresAllWhitespacesMatcher(expected); 
    } 

    private IgnoresAllWhitespacesMatcher(String expected) { 
     this.expected = expected.replaceAll("\\s+", ""); 
    } 

    @Override 
    public boolean matches(Object actual) { 
     return expected.equals(actual); 
    } 

    @Override 
    public void describeTo(Description description) { 
     description.appendText(String.format("the given String should match '%s' without whitespaces", expected)); 
    } 
} 

は渡し:

@Test 
public void testUsingCustomIgnoringAllWhitespaceMatcher() { 
    // leading and trailing spaces are ignored 
    assertThat("m2", ignoresAllWhitespaces(" m 2 ")); 

    // intermediate spaces are ignored 
    assertThat("m2", ignoresAllWhitespaces("m  2")); 
} 
関連する問題