3

Androidテストプロジェクトを作成し、現在Androidユニットテストを作成しようとしています

テストしようとしているメソッドのクラスがたくさんあり、最小アクセスの原則を適用してすべてのメンバー変数を非公開にした場合、効果的な単体テストをどのように作成しますか?

つまり、単体テストは、テストしようとしているクラスの外部のクラスにあるため、assertステートメントのメンバー変数にアクセスできません。

テスト目的ですべてにアクセスしたいこのシナリオの回避策はありますか

いくつかの単体テストを作成できるようにするために、すべてのメンバー変数に対してゲッターとセッターを作成する必要があると言わないでください。

(それについて考えると、これはAndroid固有の質問というよりもJavaの質問です)

4

2 に答える 2

1

本当にゲッターを書きたくなく、フィールド変数を検証したい場合でも、リフレクションを介してクラスフィールド変数にアクセスし、次のようにアサーションを作成できます。

ターゲットクラス:

public class TestMe{
    private String value = null;

    public void update(){
        value = "hello";
    }
}

テスト:

public class TestMeTest {

    @Test
    public void testUpdate() throws NoSuchFieldException, IllegalAccessException {

        TestMe testMe = new TestMe();

        assertNull(getField(testMe, "value"));

        testMe.update();

        assertEquals("hello", getField(testMe, "value"));

    }

    private Object getField(Object root, String name) throws NoSuchFieldException, IllegalAccessException {

        Field field = root.getClass().getDeclaredField(name);
        field.setAccessible(true);

        Object value = field.get(root);

        field.setAccessible(false);

        return value;
    }
}
于 2012-09-14T20:37:05.800 に答える
1

興味深い質問です...メンバー変数ごとにゲッター/セッターを作成する必要があるかもしれませんが。テスト用にのみ使用するサブクラス内にそれらを配置すると、運用コードでカプセル化を簡単に維持できるため、価値がある場合があります。

それが私が考えることができる最善の解決策です。

編集: または、テスト用の複製クラスを作成して、すべての「 private 」を「 public 」にすばやく置き換えることもできます。

于 2012-09-14T15:59:15.787 に答える