2

次のように、テストケースをテストスイートに追加しています。

for(String methodName : getPublicDeclaredMethods(TestA.class))
{
    this.addTest((new TestA(methodName)));
}

for(String methodName : getPublicDeclaredMethods(TestB.class))
{
    this.addTest((new TestB(methodName)));
}

これは、これを行うのと同じです。

this.addTest((new TestA("TEST_METHOD_1")));
this.addTest((new TestA("TEST_METHOD_2")));
this.addTest((new TestB("TEST_METHOD_1")));
this.addTest((new TestB("TEST_METHOD_3")));  // woops I forgot TEST_METHOD_2

メソッド名が構造を介して文字列として提供される、この奇妙なテストフレームワークで立ち往生しています。

上記のコードは、特定のクラスで定義されたすべてのテストケースを追加することを保証します。ただし、代わりに次のようなメソッドが必要です。

void <T> addTestCasesFromClass()
{
    for(String methodName : getPublicDeclaredMethods(T.class))
    {
        this.addTest((new T(methodName)));
    }
}

しかし、これがJavaでどのように行われるかはわかりません。それも可能ですか?TestAとTestBは、クラスTestから派生しています。

4

4 に答える 4

1

のようなことはできないので、ジェネリックはここでは役に立ちませんnew T。しかし、あなたはもう少し反省してそれを行うことができます。このメソッドに渡すすべてのクラスには、1つのString引数を受け入れるコンストラクターがあります。

void addTestCasesFromClass(Class<?> clz)
{
     for(String methodName : getPublicDeclaredMethods(clz))
     { 
         this.addTest(clz.getConstructor(String.class).newInstance(methodName));
     }
}

呼び出しは次のようになります

addTestCasesFromClass(TestA.class); 
addTestCasesFromClass(TestB.class);

addTestメソッドが特定の基本クラスのオブジェクトのみを受け入れる場合(それをTestBase)、のジェネリックパラメーターをに変更しclzますClass<? extends TestBase> clz

于 2013-02-27T13:02:15.387 に答える
1

ジェネリック型への参照しかない場合は、インスタンス化できません。ジェネリックはコンパイル時にのみ使用可能であるため、実行時に使用することはできません。これは、実際のクラスClassへの参照が必要であり、リフレクションを介してインスタンス化する必要があることを意味します。

Class<?> clazz = ...
Object instance = clazz.newInstance();

ただし、代わりにgetConstructorを使用することをお勧めします。

この良い例は、JavaのList.toArrayメソッドです。ジェネリックスは実行時に使用できないため、実際にクラスを参照できるように、配列のインスタンスを渡す必要があります。

于 2013-02-27T13:02:36.383 に答える
1

リフレクションを使用して、文字列引数を受け入れる、渡されたクラスのコンストラクターを見つけることができます。次に、取得したメソッド名を使用してクラスをインスタンス化します。

public <T> void addTestClassesFromClass(T item){
    try {
        Constructor<?> constructor = item.getClass().getConstructor(String.class);
        for(String methodName : getPublicDeclaredMethods(item.getClass())){
            this.addTest((constructor.newInstance(methodName)));
        }
    } catch (Exception e) {
        System.out.println("Oh crap!");
    }
}
于 2013-02-27T13:03:16.057 に答える
0

これが私の試みです:

public void addTestCasesFromClass(Class<? extends Test> c) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
{
    for(String methodName : getPublicDeclaredMethods(c))
    {
        this.addTest((c.getDeclaredConstructor(String.class).newInstance(methodName)));
    }
}
于 2013-02-27T13:06:20.047 に答える