2

質問する前に、現在の設定について説明させてください。

Service というサービス インターフェイスと、ServiceImpl という 1 つの実装があります。この ServiceImpl は、他のいくつかのサービスを使用します。すべてのサービスは、Spring ごとに Bean としてロードされます。

ここで、ServiceImpl の junit テスト ケースを書きたいと思います。同じように、applicationContext を使用して Service Bean を取得し、それに対してさまざまなメソッドを呼び出してテストします。

パブリック メソッドの場合は問題ないように見えますが、プライベート メソッドのテスト ケースを作成するにはどうすればよいですか? 実装ごとに同じプライベート メソッドを使用できない可能性があるためですか?

テストケースを書くための好ましい方法について、ここで誰か助けてもらえますか?

4

5 に答える 5

5

純粋な答えは、プライベート メソッドがそのように呼び出されるのには理由があるということです。;-)

質問をひっくり返します。(一般にアクセス可能な) インターフェイスの仕様だけが与えられた場合、コードを記述する前にテスト計画をどのようにレイアウトしますか? そのインターフェイスは、それを実装するオブジェクトの予想される動作を記述します。そのレベルでテストできない場合は、設計に問題があります。

たとえば、運送会社の場合、次の (疑似コード化された) インターフェースを使用できます。

CapitalAsset {
    Money getPurchaseCost();
    Money getCurrentValue();
    Date  whenPurchased();
    ...
}

PeopleMover {
    Weight getVehicleWeight();
    int    getPersonCapacitly();
    int    getMilesOnFullTank();
    Money  getCostPerPersonMileFullyLoaded(Money fuelPerGallon);
    ...
}

これらを含むクラスを持つ場合があります。

Bus implements CapitalAsset, PeopleMover {
    Account getCurrentAdvertiser() {...}
    boolean getArticulated() {...}
    ...
}

Computer implements CapitalAsset {
    boolean isRacked() {...}
    ...
}

Van implements CapitalAsset, PeopleMover {
    boolean getWheelchairEnabled() {...}
    ...
}

コンセプトとインターフェイスを設計するとき、のインスタンスがどのCapitalAssetように動作するかについて、財務担当者と合意する必要がありました。その合意のみに依存するテストを作成します。どの具象クラスが関与しているかに依存することなく、 、、および同様にこれらのテストを実行できるはずです。についても同様です。CapitalAssetCapitalAssetBusComputerVanPeopleMover

Busの一般的な契約から独立しているCapitalAssetaについて何かをテストする必要がある場合は、PeopleMover別のバス テストが必要です。

特定の具象クラスに含まれる public メソッドが非常に複雑で、TDD や BDD が期待される動作をきれいに表現できない場合、これもまた、何かが間違っているという手がかりになります。具象クラスにプライベートな「ヘルパー」メソッドがある場合、それらは特定の理由でそこにある必要があります。「このヘルパーに欠陥があった場合、どのような公共の行動が (そしてどのように) 影響を受けるでしょうか?」という質問をすることができるはずです。

正当な固有の複雑さ (つまり、問題のドメインに由来する複雑さ) については、クラスが特定の概念を担当するヘルパークラスのプライベート インスタンスを持つことが適切な場合があります。その場合、ヘルパー クラスは単独でテストできる必要があります。

良い経験則は次のとおりです。

複雑すぎてテストできない場合は、複雑すぎます。

于 2009-01-09T12:47:10.023 に答える
4

プライベート メソッドは、クラスのパブリック インターフェイスを介して実行する必要があります。同じインターフェースの実装が複数ある場合は、実装ごとにテスト クラスを作成します。

于 2009-01-09T11:53:08.150 に答える
0

テストケースを分割する必要があると思います。

最初に、インターフェイスのさまざまな実装を呼び出しているクラスをテストします。これは、パブリック メソッドをテストしていることを意味します。

この後、別のテストケースでインターフェイス実装クラスをテストします。リフレクションでメソッドを呼び出すことができます。

于 2009-01-09T11:52:37.653 に答える
0

http://www.artima.com/suiterunner/privateP.htmlで、JUNIT を使用してプライベート メソッドをテストする方法に関する興味深い記事を見つけました。

したがって、パブリック メソッドをテストすることにより、プライベート メソッドを間接的にテストすることを優先する必要があると思います。例外的な状況でのみ、プライベート メソッドのテストを検討する必要があります。

于 2009-01-09T12:44:28.140 に答える