2016-09-26 2 views
1

は、私は、メソッドチェーンことができます()メソッドの保存デシベルサービスがあります。Mockitoで連鎖メソッドをモックするためのRETURNS_DEEP_STUBSの代替手段はありますか?

@Service 
public class Service { 
... 
    public Service save(...) { 
     ...  
     return this; 
    } 

をし、これは、単に素晴らしい作品:私はそれは私がない限り壊れてもMockitoとそれを模擬するために来るとき

service.save(this).save(that).save(other); 

Service serviceMock = mock(Service.class, RETURNS_DEEP_STUBS); 

IIUCただし、RETURNS_DEEP_STUBSの使用は不良とみなされます。メソッド呼び出し連鎖でクラスを模擬する良い方法はありますか?

+0

'service.save(thiz、that、other)'のように使われるメソッド 'void save(Object ... entities)'を作成する方法はありますか? – SpaceTrucker

+0

これは確かにこの例を修正するでしょうが、私は本当に一般的な場合にもっと興味があります。 – Ian

答えて

2

あなたのパターンsaveはビルダーパターンと非常によく似ています。これは、質問に「How to mock a builder with mockito」と同様のことがあります。

David Wallace's answer thereには、モックがメソッドの戻り値の型のインスタンスであるかどうかを検出し、その場合のみモックを返すAnswerを書くことができます。この機能は、Mockito 2.0のRETURNS_SELFというMockitoライブラリにも組み込まれていました。任意のAnswerと同様に、thenAnswerの特定のメソッド呼び出し、またはmockの2番目のパラメータとしてこれを使用してデフォルトの応答にすることができますが、Mockitoのドキュメントでは寛大な戻り値の型(例:Object)それが意図されていたかどうかにかかわらず、模倣。

+0

私はRETURNS_DEEP_STUBS /がこの場合には悪いと確信していません。この著者、http://tuhrig.de/everytime-a-mock-returns-a-mock-a-fairy-dies/は、同意しているようです。しかし、私はメソッド連鎖をしない別の理由を発見しました.Mockitoは、上記の例ではなく、save()の呼び出しを3つだけ記録します。 – Ian

+0

私はRETURNS_DEEP_STUBSには場所がないとは言いませんが、ここでは少なくとも_unrealistic_のようです:ビルダーパターンは 'instance.save(foo) - > instance'とRETURNS_DEEP_STUBSがそれに違反することを保証している可能性があります。すべての実装で壊れているわけではありませんが、実装に依存しないテストを作成しようとしている場合は、それを維持して、テスト中のシステムが動作している間に壊れやすいテストを取得しないようにします。 (また、 'save'と検証については一般的に注意する必要があることを正しく述べていますが、RETURNS_SELFはやや直感的です。) –

+0

良い点。私は、開発中に静止しているように見える一方で、私はM2.0にステップアップするのに少し消極的だったことを認めなければならない。 – Ian

関連する問題