0

工場の動作コードをテストするためのベストプラクティスは何だろうと思っています。私の場合、ファクトリは FooBar インスタンスのコンストラクターに渡されるいくつかの依存関係インスタンスを作成します。

public class FooBarFactory {
  private Dependency1 dependency1;
  private Dependency2Factory factory;

  public FooBarFactory(Dependency1 dependency1, Dependency2Factory factory) {
    this.dependency1 = dependency1;
    this.factory = factory;
  }

  public FooBar create() {
    return new FooBar(dependency1, factory.create(), new Dependency3());
  }
}

依存関係は、他のいくつかのファクトリによって作成されるか、テスト対象のファクトリによって直接作成されます。

ファクトリの動作をテストするために、現時点でやらなければならないことは、FooBar で保護された getter をいくつか作成して依存関係を取得することです。これにより、コンストラクター インジェクションと依存関係が正しく作成されたことをアサートできます。

これは私が確信していないところです。テストの目的でいくつかのゲッターを追加すると、カプセル化が壊れるため、少し気になります。リフレクションを使用してフィールドの値を取得することもできますが、これは破りやすいため、通常は悪い習慣だと考えています。

誰でもこの問題についての洞察を提供できますか?

4

4 に答える 4

1

FooBar1 つの解決策は、クラスをモックし、によって返されたインスタンスFooBarFactory#create()が作成されたコンストラクター呼び出しを検証することです。JMockit モック API を使用すると、このようなテストは次のようになります。

public class FooBarFactoryTest
{
    @Injectable Dependency1 dep1;
    @Injectable Dependency2 dep2;
    @Cascading @Injectable Dependency2Factory dep2Factory;
    @Mocked FooBar mockFooBar;
    @Tested factory;

    @Test
    public void createFooBarWithProperDependencies()
    {
        assertNotNull(factory.create());

        new Verifications() {{ new FooBar(dep1, dep2, (Dependency3) withNotNull()); }};
    }
}
于 2012-07-09T17:18:57.493 に答える
0

単体テストとして、単体 (クラス) とこれだけをテストする必要があります。

ファクトリ内のファクトリによって作成された値は、単体テストでテストする必要があります。たとえば、あなたの状況では、何がdependency2Factory返されるかをテストするのは意味がありません。機能するためには、(構成可能でない場合) も機能するはずです。構成可能な場合は、独自のモックを提供できます。これは次のようになりますFooBarDependency2Factory足りる。

またDependency2Factory、別の単体テストでテストする必要があります。

List.get(int index)実装でリストを使用するたびに、メソッドが機能するかどうかをテストしませんか?

于 2012-07-09T14:10:54.213 に答える
0

頭に浮かぶ提案は、FooBarFactory の依存関係も同様に注入することで、Dependency1 と Dependency2Factory をコンストラクターのパラメーターまたはセッター メソッドの値として受け取るようにすることだと思います。

于 2012-07-09T14:16:17.060 に答える
0

嘲笑するのはどうですか?テスト済みのコードを実行するために必要なすべての依存関係をモックします。mockito のようないくつかの優れたモック フレームワークがあります。

于 2012-07-09T14:45:14.267 に答える