11

コードに静的メソッドがあり、なんとかしてモックを作成したいと思います。

私はjmockを使用しています。

これができると思う1つの方法は、静的メソッドの周りに「ラッパークラス」を配置してこれをモックすることですが、より良い解決策を望んでいました。

私はこれについて間違った方法で行っていますか?

フィードバック:

静的メソッドを呼び出すだけのメソッドを持つインターフェイスとクラスを作成する予定でした。このラッパークラスの呼び出しをモックするだけで、ロジックをモックできます。(それについて話しても汚いです:))

4

3 に答える 3

8

jMock で静的メソッドをモックすることは、私たちの設計アプローチに合わないため、サポートしていません。システムの状態に影響を与える可能性のある重要な機能には、静的メソッドを使用しないことをお勧めします。オブジェクト指向コードをサポートし、読みやすくするためだけにそれらを使用する傾向があります。そのため、静的メソッドのモックは問題があることのヒントと見なされます。1 つの例外は、サードパーティのライブラリにある場合ですが、いずれにせよ、よりオブジェクト指向のものでラップすることになるでしょう。

于 2009-05-21T12:51:20.410 に答える
5

JMockitは、静的メソッド (および最終メソッド、コンストラクターなど) のモックを可能にする別のツールキットです。

OO ソリューションを設計する際に、静的メソッドを適切に使用ても問題はないと思います。

たとえば、私が好んで使用するパターン/イディオムの 1 つは静的ファサードです。特に、ビジネス アプリケーションの永続化サブシステムに、よりシンプルで使いやすい API を提供します。私の意見では、次のようなものよりもエレガントなソリューションは他にありません。


    List<Person> peopleAboveAge = 
        find("select p from Person p where p.age >= ?", age);

メソッドは、静的メソッドのみを定義findするクラスから静的にインポートされPersistenceFacade、適切な Session/EntityManager インスタンスを取得する方法をカプセル化します。このソリューションは、単体テストにやさしく柔軟です。Hibernate を使用して、500 以上の永続エンティティを持つビジネス アプリケーションで使用しました。静的ファサードは、Hibernate 2 から Hibernate 3 に移行したとき、Oracle から Sybase に移行してから Oracle に戻ったとき、ORM マッピングに「hbm.xml」ファイルの代わりに JPA アノテーションを使い始めたときに役立ちました。

于 2009-06-27T17:35:49.500 に答える
2

Powermockは、静的メソッドのモックを可能にする EasyMock の拡張機能です。

于 2008-11-04T03:53:16.337 に答える