2012-01-02 3 views
0

私はeasymockを使用しています。私はUserServiceクラスを嘲笑しています。方法のいくつかは、お互いを呼び出す、と私は方法#1をテストしていた場合、私はある/モックメソッド#2と方法#3をスタブにしたい今サービスの一部を模擬して他人をテストするには?

boolean canUserLogin(..); 
boolean canUserJoinClass(...); 

私UserServiceのは、いくつかの方法がありますメソッド#1で呼び出されます。

私が混乱しているのは、クラスの一部を模擬して他の人に実際のコードを実行させるにはどうしたらいいですか?

私はUserService.method#1を実際にテストしたいが、UserService.method#2とUserService.method#3をモックしてメソッド#1が内部的に呼び出すようにしたい。

答えて

3

mockedしたいメソッドの戻り値を指定する。例についてはeasymock docsを参照してください。

  • 「戻り値の指定」では、モックされたメソッドの戻り値の作成について説明します。
  • 「部分的な模擬」(下に向かって)セクションでは、実際のクラスを模擬して説明しています。

これは、スケッチされたデザインの兆候である可能性があるドキュメント(およびその他の回答)に同意します。それ以上の詳細がなければ、それがどれほどスケッチであるかは言うまでもありません。

0

モッキングは依存関係のために使用されるため、単独でテストすることができます。この場合、呼び出すメソッドは1つのクラスにあるため、依存関係はありません。だから私はここで嘲笑を使わないだろう。

メソッド2とメソッド3が非常に複雑なので、メソッド1をテストするときにモックしたい場合は、それらを自分のクラスに分けて、簡単にモックできます。

1

あなたはEasymockのようなライブラリをチェックすることができますが、これができるかどうかはわかりません。

ここにサードパーティのライブラリがない私のソリューションです。 UserServiceのサブクラスを作成し、モックするメソッドをオーバーライドします。

class SubUserService{ 

    @override 
    boolean canUserJoinClass(...){ 
    return false; 
    } 

} 

しかし、モックメソッドはプライベートにできないことに注意してください。

これが本当に問題になる場合は、別のクラスにメソッドをリファクタリングする必要があります。

1

私はMockitoが実際のオブジェクトに「スパイ」をサポートしていることを知っています。 Easy Mockで同等のものを見つけることができませんでした。あなたがこれを行うことができるかどうかは分かりません。

これは、これは私にとっては匂いだと言われています。なぜそれを嘲笑する必要がありますか?これは、あなたのオブジェクトがあまりにも多すぎて、他のやりとりを模倣する必要があるという事実を示していますか?

また、メソッドの実装(この場合はメソッド1)、つまりmethod2とmethod3(特に同じクラス)を呼び出すということを心配する必要があるときはいつでも、カプセル化が漏れているように聞こえます。