1

テストしたい MyClass があります。

これに使用する TestMyClass クラスがあります。

MyClass には、いくつかのプライベート変数があります。

TestMyClass でこれらのプライベート変数を使用してテストを実行したいと考えています。

これらのプライベート変数をすべてパブリックに変更してから、TestMyClass でオブジェクトとして使用できますが、これらの変数の可視性を高めずにテストを行う方法はありますか? つまり、手動で TestMyClass にアクセスし、プライベート ビジビリティ マーカーを削除して、「パブリック」ビジビリティ マーケットに入る必要はありません。

ありがとう!

4

6 に答える 6

4

プライベート メンバーを直接テストすることはお勧めしません。コードは、これらのプライベート メンバーがパブリック (インターフェイス) メソッドによって間接的に呼び出されるように設計する必要があります (例: メンバー変数のセッターとゲッターを使用できます)。

しかし、どうしてもプライベート メンバーをテストしたい場合は、 Java Reflection APIを使用できます。

于 2013-03-05T09:14:39.500 に答える
2

セッター/ゲッターを提供して、変数を公開する代わりにそれらを使用してみませんか?

于 2013-03-05T09:15:41.530 に答える
2

setter and gettersクラス内のそのプライベートプロパティにpublicを使用する

于 2013-03-05T09:16:02.527 に答える
2

他の回答で説明されているように、プライベートメソッドをテストしたり、プライベートフィールドにアクセスしたりする必要はありません。あなたが本当にこれをしたい/しなければならないなら、PowerMockは行く方法です。

プライベート属性にアクセスしてそれらを設定する必要がある場合は、SpringのReflectionUtilsが非常に役立ちます。mockitoを使用している場合は、 @ InjectMocksアノテーションを使用することもできます。これ@Mockにより、テストされたオブジェクトのテストクラスに注釈付きの属性が挿入されます。

それ以外の場合は、またはへのpublicアクセスを変更する可能性があります。これは、よりもはるかに制限されます。protectedpackage privatepublic

于 2013-03-05T09:29:39.870 に答える
1

ゲッター/セッターを使用してプライベート変数を操作することの何が問題になっていますか?setUp()テストクラスで/メソッドを使用@Beforeして、テストする状態を設定できます。例えば:

public class MyClass {
    private int myInt;
    public void setMyInt( int i ) { this.myInt = i; }
    public int getMyInt() { return this.myInt; }

    public void addsTo( int add ) { return myInt + add; }
    ...
}


public class TestMyClass {
    MyClass my = new MyClass();
    @Before public void setup() { my.setMyInt( 42 ); }
    @Test public void testIs42() { assertEqual( "MyInt is 42" , my.getMyInt() , 42 ); }
    @Test public void testAddsTo() { assertEqual( "addsTo() works" , my.addsTo( 10 ) , 52 ); }
}

意味がありますか?この方法では、パブリックメソッドを介してのみプライベート変数を操作します。このaddsTo()例は、ゲッター/セッターではなく、クラスが公開するパブリックメソッドを通常テストすることを示すためのものです。

同様に、クラスメソッドのテストを可能にするために、メソッドの可視性をプライベートから保護に変更することがよくあります。

乾杯、

于 2013-03-05T09:16:40.887 に答える
1

1つの解決策は、それらを保護済みとしてマークしてから、ゲッター/セッターを使用してそれらを公開するMyClassTestSupportを用意することです。ただし、クラスが他のクラスの基本クラスである場合、このパターンはうまく機能しません...

于 2013-03-05T09:17:19.470 に答える