2011-07-11 13 views
1

私はFluent Assertionsを使用し始めていると私はそれをたくさん好きですが、それはこのような一般的な方法で既存のテストを拡張することが可能ですかしらの拡張:流れるようなインターフェイス

  • GroupAssert
  • 方法hasSizeAtLeast(int limit)を追加これらは単なるeはx.either().isIn(someSet).or().isNull()

ようStringAssert

  • 使用の代替方法startsWithIgnoringCase(String prefix)を追加私はすぐに何が必要なのかを示します。私はそれらのそれぞれについていくつかの回避策を講じることができます。しかし、私は流暢なインターフェースの読みやすさと使いやすさを失います。

    私の最後の例は、x.isIn(someSet)x.isNull()の両方のiffをスローすることを意図しています。

  • +0

    私はXOR接続として、彼らはスローする。 (しかし、私はネイティブの英語のスピーカーではありません) –

    +0

    どちらも私ですが、あなたは正しくはないと思います。 AFAIKは、選択の存在を強調したいときに「どちらか」を使用することもできます。また、 'hamcrest'はこれをこの方法で使います。 – maaartinus

    +0

    流暢なアサーションへのリンクは404です。 –

    答えて

    1

    ここでは、既に処理された型のアサーションを拡張するためのAPIを開くことについて、著者によってa postがあります。特にレッスン1では、クラスを未定義クラスに変更する方法について説明します。この投稿では、サブクラスStringAssertの例がMyStringAssertとなっています。

    しかし、StringAssertなどのクラスをAPIの「流暢さ」を維持するように拡張することはできないようです。 StringAssertクラスはfinalクラスではありませんが、サブクラスでそのタイプ(すなわち、StringAssertのメソッドによって返される「this」タイプ)をパラメータ化することはできません。たとえば、MyStringAssertにメソッドcheckFooを追加したとします。あなたが発見したように、元のStringAssertメソッドが返すので、以下は無効ですStringAssert

    new MyStringAssert("abcd").contains("a").checkFoo(); // compile-time error! 
    

    あなただけの種類のラメ有効ですが、これは、最初のサブクラスのメソッドを呼び出すことができます。

    new MyStringAssert("abcd").checkFoo().contains("a"); // compiles 
    

    あなたは考えるかもしれません著者に連絡するか、gitプロジェクトにパッチを提出することさえできます。可能な解決策は、StringAssertにパラメータ化された型を追加し、Assertions.assertThat(String)の匿名サブクラスを使用してStringAssert具体的な型を指定することです。これはとにかく推奨されるエントリポイントです。あなたが説明したように、他の人はサブクラスStringAssertを作成できます。私はこの提案もテストしていませんが、意味があるようです...

    +0

    ありがとうございます。 'MyStringAssert'を返すことができないので、' StringAssert'を拡張することは実際には機能しません。だから、新しいMyStringAssert( "abcd")。contains( "a")。hasSizeAtLeast(3); '継承を使って作業することはできません。 – maaartinus

    +0

    ええ、そうです。混乱のためのお詫び、私はこれを最初に試みたはずです!私は誤った情報を削除し、いくつかの提案を提供する私の応答を行います。 – jtoberon

    +0

    どこから始めればいいか分からないので、問題はありません。私はあなたの提案が理にかなっていると確信しています。それは残念ですが、Javaは、[self-types](http://www.jroller.com/scolebourne/entry/java_7_self_types)のような恐ろしい回避策しか提供していないため、誰もが無用な汎用パラメータでコードを汚染したり、柔軟性を失います。 – maaartinus

    関連する問題