6

私のコードでは、同じクラス内でパブリックメソッドまたはプライベートメソッドを呼び出すことがあります。これらのメソッドは、独自のクラスに引き出されるのに適した候補ではありません。私が呼び出すこれらの各メソッドは、独自の単体テストでテストされます。

したがって、クラスAにもクラスAの各メソッドを呼び出すメソッドがある場合、呼び出しをモックする方法はありますか?私は確かに私の期待/モックの振る舞いを切り取って貼り付けることができますが、それは退屈であるだけでなく、テストのポイントを曖昧にし、モジュール性に違反し、返されるものを制御できないためにテストをより困難にします。

そうでない場合、この種のことに対する通常の解決策は何ですか?

4

3 に答える 3

2

部分的なモックを探しているようです...それらをカバーする1つのブログ投稿があります: http ://www.jroller.com/alessiopace/entry/partial_mocks_with_easymock

これにはEasyMockClassExtensionが必要ですが、残念ながらプライベートメソッドをモックすることはできません。

于 2012-11-27T20:57:43.467 に答える
1

これは、EasyMock 2.2クラス拡張、またはEasyMock 3.0以降(クラス拡張を含む)で実行できます。

部分的なモックはここに文書化されています:

http://www.easymock.org/EasyMock2_2_2_ClassExtension_Documentation.html

構文はかなり単純です。モックするクラスと、モックするメソッドを指定します。この例では、クラスが「Dog」であり、「eat」と「eatUntilFull」の2つのメソッドがあるとします。このコードをeatUntilFullテストに入れることができます。

mockDog = createMockBuilder(Dog.class).addMockedMethod("eat").createMock();

その後、他のモックと同じように扱うことができます。

警告:

1)クラス内のあるメソッドを別のメソッドから呼び出すことは、設計が不十分であることを示している可能性があります。そのロジックを別のクラスに抽象化できますか?

2)できない場合でも、テスト中にメソッドが別のメソッド自体を呼び出しても問題がない場合があります。これが好ましい動作である可能性があります。

3)まだプライベートメソッドをターゲットにできないため、プライベートではなくパッケージプライベートとして設定することをお勧めします。

于 2012-11-27T22:28:15.110 に答える
0

一般的に、プライベートメソッド(またはテストしている同じクラスのパブリックメソッド)をモックする必要がある場合は、このメソッドのコードを別のクラスに移動することを検討する必要があります。

テストの観点からは、テストしているメソッドが期待される状態をどのようにアーカイブするか(他のメソッドを呼び出すかどうかに関係なく)は重要ではありません。重要なポイントは、メソッドが実行する状態の結果的な変化であり、メソッドが実行するために呼び出すメソッドではありません。

于 2012-11-27T20:49:39.520 に答える