4

Javaでいくつかの呼び出しをモックする方法について質問があります。たとえば、これがあると想像してください:

import whatever.package;

Class myClass extends otherClass {

    public void myMethod() {
        ...
        int a = methodCall();
        ...
    }
}

問題は、「methodCall()」がパッケージ「whatever.package」に由来し、「otherClass」から継承されていることです。それをモックして、必要な int を返すことはできますか?

本当にありがとう!!

4

2 に答える 2

3

コメントで明確化した後

継承されている場合は、私が提案した最後のパターンを使用して(test extends myClass)、methodCall()をオーバーライドするだけです。


この回答では、methodCall()はあなたが所有する別のクラスの非静的メソッドであると想定しています。

サンプルコードを変更しましょう:

import whatever.package;

Class myClass 
{
    public void myMethod() 
    {
        ...
        anotherClass aClass = new anotherClass();
        int a = aClass.methodCall();
        ...
    }
}

そこで、anotherClassのmethodCall()をモックアウトしたいと思います。

通常の手順は、インターフェースを使用し、「配線」を別の場所に押し出して、密結合を回避することです。ディペンデンシーインジェクションと同様の概念について調査します。

つまり、新しいanotherClass()を使用すると、密結合が作成されます。別のClassオブジェクトをmyClassコンストラクターに注入するか、ゲッターとセッターを介して注入することができます。ユニットテストを書くためにモックアウトが必要だと思います。次のコードを検討してください。

import whatever.package;

Class myClass 
{
    private IanotherClass another;

    public void SetAnotherClass(IAnotherClass aClass)
    {
         another = aClass;
    }

    public void myMethod() 
    {
        ...
         int a = another.methodCall();
        ...
    }
}

テストコード:

   myClass testedClass = new myClass();
   testedClass.SetAnotherClass(new MyAnotherClassMock());
   testedClass.myMethod();

実装ではなく、インターフェースに対する依存関係の注入とプログラミングに関しては、このトピックについて読むべきことがたくさんあります-ただググってください!

コード全体を再設計せず、簡単な(そして少し汚い)修正が必要な場合は、anotherClassインスタンスの作成を別のメソッドに移動してから、テストクラスにクラスから継承させ、前述のメソッドを上書きすることを検討してください(これは常に可能であるとは限りません-すべては実際のコードに依存します)

例:

Class myClass 
{
    public void myMethod() 
    {
        ...
        IanotherClass aClass = GetAnotherClassInstance();
        int a = aClass.methodCall();
        ...
    }

    protected IanotherClass GetAnotherClassInstance()
    {
        return new anotherClass();
    }
}

Class MyTestClass extends myClass
{
   @overwrite
   protected IanotherClass GetAnotherClassInstance()
   {
        return new anotherClassMock();
   }
}

次に、myTestClassをテストに使用します。

于 2012-09-28T11:52:21.453 に答える
-1

コードを再設計せずに?

methodCallのクラスをモックし、それをclasspathorderにプッシュします。

于 2012-09-28T11:34:42.473 に答える