2017-11-08 6 views
1

は考えてみましょのみラムダ式のチェーン内の他のメソッドを呼び出すJavaメソッドをテストするJavaメソッド:ユニット

public result method(Optional<T> param) { 
     return param.flatmap(SomeOtherClass::method1) 
        .flatmap(SomeOtherClass::method2) 
        .orElseThrow(new RuntimeException(" ")) 
    } 

それは本当にユニットテスト方法に理にかなっていますか?私の議論は、method1はラムダ式を呼び出しているだけなので、実際に何もしないので意味がありません。 ここで間違っている場合は、訂正してください。可能であれば、複数のケースをカバーする単体テスト(Mocksを使っても問題ありません)を扱うコードサンプルを用意してください。

+0

これが難しい理由は、SomeOtherClassの2つの静的メソッドです。これらを静的でないメソッドに置き換えることができ、クラス内の特定のオブジェクトに対して呼び出す方法はありますか?その後、それらをスタブして、実際にまともなテストを書くことができるでしょう。 –

答えて

1

マッピングが「何もしていない」と出会えない場合は、例外をスローしません。 「国連とどうなりますか

  • 成功マッピング
  • 私ができる

    • 成功したマッピングで何が起こる:

      あなたは間違いは、少なくとも2つの場合にこのメソッドをテストしたいです私はObjectObjectの間のマッピング方法がわからないので、あなたが利用できるソースを提供していません。

    +0

    最後にflatmapが空のオプションを返す場合に例外がスローされます。メソッドの要求仕様です。 – shanks

    +0

    ...それはあなたがテストしたいと思うものですよね?それが要件であり、すべてであることを考えると。 – Makoto

    +0

    ええ:)。しかし、それはオプションの責任です。これは、オプションが値を持たない場合に例外をスローすることを意味します。メソッドは例外を制御できません。あなたは例外的なシナリオをカバーするテストを手伝うことができます。嘲笑は大丈夫です。 – shanks

    -1

    Optionalをパラメータとして使用しないでください。

    public result method(T param) { 
        return Optional.ofNullable(param) 
          .flatmap(SomeOtherClass::method1) 
          .flatmap(SomeOtherClass::method2) 
          .orElseThrow(new RuntimeException(" ")); 
    } 
    

    あなたの質問にお答えください。あなたは@Makotoが上で答えたようにこのメソッドをテストし、method1method2を別々にテストしなければなりません。

    EDITミスタイプ; should - > should not

    +0

    @Makotoあなたの 'again'はどういう意味ですか?私はちょうどオプションの内部関数を使用するように提案しましたが、パラメータとしては使用しません。 – dehasi

    +0

    パラメータは既に「オプション」として入力されています。それをパラメータとしてではなくメソッドに移動するのは問題です。あなたはここで椅子を並べ替えて、非常に少ない利益を得ています。 – Makoto

    +0

    @Makotoだから、 'wrapped with optional'ではなく' raw type'を使うことをお勧めします。メソッド本体に既に入力をラップします – dehasi