4

クラスを初期化せずにメソッドをテストする方法があるかどうか疑問に思っています。methodToTest 私が尋ねている理由は、コンストラクターで渡されるオブジェクトがたくさんあるためです。これは、徹底的なチェックからオブジェクト属性を使用していないように見える一方で、多くのモックスタブを意味します。それ以外の場合は、メソッドが静的に変換される可能性があるのは私のコードではありません。

class ExampleClass {
   public ExampleClass(FirstClass fc, SecondClass sc, ThirdClass tc) {}

   public void methodToTest(FourthClass foc) {}
}
4

6 に答える 6

1

通常、コンストラクターに多くのパラメーターがあることは、悪い概念のヒントです。コンストラクターに渡す引数を減らすために、オブジェクトとクラスを再考することをお勧めします。

そうしたくない場合でも、クラスをインスタンス化するある種の「TestUtil」を使用できます。


例 :

public class MyTestUtils {
    public createValidFirstClass() {
        return new FirstClass(/* some arguments here */);
    }
    public createValidSecondClass() {
        return new SecondClass(/* Some arguments here */);
    }
    public createValidThridClass() {
        return new ThridClass(/* Some arguments here */);
    }
    public createValidExampleClass() {
        return new ExampleClass(createValidFirstClass(), createValidSecondClass(), createValidThridClass());
    }
}

このクラスは、プロジェクトではなくテスト パッケージに含める必要があり、テスト以外では使用しないでください。実際のプロジェクトには Factory または Builder を使用してください。



とにかく、最善の解決策はクラスを再考することだと思います。
例 :

public class People {
    public People(String firstName, String lastName, Date birth, Date death) {
    }
}

ご覧のとおり、指定されたすべてのパラメーターが正しくフォーマットされていて、null ではないことを制御するのは面倒です。

メソッドに渡される引数の数は、この方法で減らすことができます。

public class People {
    public People(PeopleNames names, Period period) {
    }
}
public class PeopleNames {
    public People(String firstName, String lastName) {
    }
}
public class PeopleNames {
    public People(Date begin, Date end) {
    }
}
于 2015-07-25T19:23:42.857 に答える
1

わかりました、方法を見つけたようです。メソッドはオブジェクトの状態とは無関係であるため、オブジェクトをモックして、呼び出されたときに実際のメソッドを使用するように MockRunner に命令することができます。これは部分モッキングと呼ばれます。それを行う方法は

    ExampleClass = PowerMockito.mock(ExampleClass.class);
    when(ExampleClass.methodToTest(foc)).thenCallRealMethod();
于 2015-07-24T15:15:16.937 に答える
1

ここにはいくつかのオプションがあります。

  • 実際のオブジェクトへの参照が必要ないように、メソッドを静的にします。これは、メソッドが ExampleClass の状態を必要としない場合にのみ機能します (つまり、必要なものはすべてメソッドの引数で渡されます)。
  • このメソッドを、単独でテストしやすい別のクラス (おそらくメソッド オブジェクト パターンを使用して) に抽出します。このリファクタリングは、メソッドをメソッド オブジェクトに置き換えると呼ばれます。
于 2015-07-23T12:56:25.770 に答える
0

私の知る限り、クラスを初期化せずにテストを実行することはできません。

Test の 3 つのステップは、Arrange、Act、Assert です。クラスは、テストしている特定のクラスで必要なメソッドをフェッチするために、アレンジ部分で初期化する必要があります。

于 2015-07-23T12:55:13.150 に答える