1

私は Java で書かれた大規模なプロジェクトで Groovy を紹介しています。まず (ほとんどの人がそうであるように)、Groovy で Java クラスの単体テストを作成します。

だから私が持っている問題は次のとおりです。

ClassA と ClassB という 2 つの Java クラスがあり、次のようにやり取りしているとします。

public class ClassA {
  public void doSomething(...) {

    ...//something

    ClassB.invokeSomeStaticMethod((someParam);

    ...//something

  }
}

ClassB は、データベースからいくつかのデータを検索するサービスです。ClassA 機能をテストしています。だから私はどういうわけかClassBをモックしたいので、単体テストのコンテキストでinvokeSomeStaticMethod()はテスト用にモックされた値を返します。私が理解している限り、ここでの主な問題は、両方のクラスが Java であるため、ClassB.invoke... メソッドが Groovy Mocks のベースとなっている Groovy MOP を介してルーティングされないことです。私は正しいですか?そして、どうすれば必要なものを達成できますか?

ありがとう!ミハイル

4

3 に答える 3

1

シングルトンのような静的メソッドは、妥当性を損なうものです。これはGroovyのような動的言語では少し劣りますが、ここでは確かに、古典的な妥当性の問題に直面しています。

解決策は、依存関係を外部化し、静的メソッドをから削除することです。ClassB

public class ClassA(ClassB classB)
{
    ClassB classB
    public void doSomething()
    {
         classB.invokeSomething();
    }
}

このアプローチには2つの利点があります。

  • ClassAに緊密に結合されなくなりましたClassB。サブクラスまたはモックに置き換えることができます。
  • ClassAClassB何かが足りないことを開発者に知らせるためにランタイムエラーに依存するのではなく、世界が知るための依存関係をアドバタイズするようになりました。

Singletons are Liars(Google Testingブログからの)の優れた記事は、この概念を探求する優れた仕事をしています。

于 2011-03-09T21:51:44.600 に答える
0

まあ、私はメタプログラミングが役立つかもしれませんが、ClassBがJavaコードから呼び出されると、そのメタクラスは機能しません。

Groovyにパラメーターのないモック静的メソッド

于 2011-03-10T04:52:10.643 に答える
0

私の知る限り、Groovy MOP は への呼び出しを置き換えることができませんClassB.invokeSomeStaticMethod(someParam)JMockitのようなフレームワークを使用して、静的メソッドをモックすることができます。

于 2011-03-09T21:51:17.577 に答える