2017-09-05 4 views
3
Rultorをリファクタリングする Cactoosの代わり Guava使用している間、私は GithubProfileTestGithubProfileValidationTestの負のテストの問題を抱えている

UncheckedIOExceptionではなく、異なる予想される例外のスローされ

リファクタの後で、正のテストケースは両方のテストクラスを通過しますが、特定の例外を予期する負のテストケースは失敗します。 影響を受けるリファクタされたコードはGithubProfile.assetsメソッドとGithubProfile.assetメソッドです。

私はこのように見てassets方法リファクタリング:this.assetコールがProfile.ConfigExceptionをスローするように期待されているさまざまなテストケースでは

public Map<String, InputStream> assets() throws IOException { 
    final XML xml = this.read(); 
    final List<XML> nodes = xml.nodes("/p/entry[@key='assets']/entry"); 
    return new MapOf<>(
     new Mapped<>(
      nodes, 
      input -> 
       new MapEntry<>(
        input.xpath("@key").get(0), 
        this.asset(input.xpath("text()").get(0)) 
       ) 
     ) 
    ); 
} 

を。代わりに、assetsメソッドを呼び出すと、テストはUnable to evaluate the expression Method threw 'java.io.UncheckedIOException' exceptionで失敗し、Profile.ConfigExceptionは単に無視/非表示になります。

MapOfは何とか評価するために失敗したと思われる、またはそれ自体がUncheckedIOExceptionを上げるthis.assetメソッドの呼び出しが発生することを「非表示」、例外、ので、私はこれを修正することができないんだとProfile.ConfigExceptionを上げています。

デバッグ時にUncheckedIOExceptionには、Profile.ConfigExceptionの情報が含まれていません。

この動作や解決策が得られる理由についてのヒントはありますか?

+0

「UncheckedIOException」をスローするコードの唯一のコードは、あなたの 'read()'メソッドです。それは何をするためのものか? – fge

答えて

3

Iterable#next()(JDK)では、チェック例外(Profile.ConfigExceptionなど)をスローすることができません。だから、org.cactoos.iterator.Mappedはそれらをすべて捕まえて、代わりにUncheckedIOExceptionを投げるのです。 JDKデザインのおかげで、修正することはできません。できるだけ良いことは古いですforループ:

public Map<String, InputStream> assets() throws IOException { 
    final XML xml = this.read(); 
    final List<XML> nodes = xml.nodes("/p/entry[@key='assets']/entry"); 
    final List<MapEntry> entries = new LinkedList<>(); 
    for (final XML node : nodes) { 
    entries.add(
     new MapEntry<>(
     input.xpath("@key").get(0), 
     this.asset(input.xpath("text()").get(0)) // checked exeption here 
    ) 
    ); 
    } 
    return new MapOf<>(entries); 
} 
3

おそらく変換がorg.cactoos.func.UncheckedFuncで実行されているため、マップに繰り返し入力する必要があります。

通常、関数型プログラミングは例外でうまくいっていないので、APIはチェックされた例外の宣言を避けようとします。だからおそらくそれで生きなければならないだろう。

関連する問題