0

すでに抽象クラスでこのメソッドを使用するために、抽象メソッドを定義したいと思います。次に、この抽象メソッドを、抽象クラスを拡張するさまざまなクラスで定義してもらいたいと思います。

しかし、どうすればこれを行うことができますか?

(目標は、統合テストにいくつかの基本的な方法を提供することです。これらはすべて同じ「構造」を使用しますが、いくつかの異なるロジックを実装します)。

抽象クラスでパラメーターを使用して抽象メソッドを定義し、この抽象メソッドをすでに抽象クラスで使用し、テスト実装で最初にメソッドを実装するにはどうすればよいですか?

public abstract class BaseIT {
    protected doVerify(String params..) {
        if (isValid()) {
            //basic verification for all extending testcases
        }
    }

    protected abstract boolean isValid(Object o);
}


public class TestA_IT extends BaseIT{
    @Test
    public void myTest {
        //do some specific stuff and verify with resulting params

        doVerify(params..);
    }

    protected boolean isValid(Object o) {
        return o.isValid();
    }   
}

これは私の問題の(ばかげた)例にすぎないことを覚えておいてください。もちろん、isValidの結果を基本クラスのメソッドに渡すこともできますが、私の特定のケースでは、このようにはならない可能性があります。

問題は次のとおりObject oです。テストケースの実装ごとに異なるオブジェクトです。

私はこれにインターフェースを使用しないかもしれません。どうすればこれを可能にできますか?

4

5 に答える 5

0

あなたはそれをキャストすることができます:

((Class)o).isValid()

しかし、私はより良い方法はメソッドを使ったインターフェースを作ることだと思いますisValid()。そして、これらすべてのオブジェクトをそれに実装させます。

于 2012-06-20T10:28:23.567 に答える
0

あなたが示す2つのクラスには継承関係がないため、あなたの例は紛らわしいです。これを明確にするまで、isValid()メソッドをジェネリックにすること、および/またはメソッドとのインターフェースである型のオブジェクトを取得することを調べましたisValid()か?

いずれにせよ、キャストや を含むソリューションには近づかないでinstanceofください。

于 2012-06-20T13:00:18.657 に答える
0

あなたがすることができます:

public class TestA_IT extends BaseIT {
    @Test
    public void myTest {
        //do some specific stuff and verify with resulting params

        doVerify(params..);
    }

    protected boolean isValid(Object o) {
        return (o instanceOf YourObject) ? ((YourObject)o).isValid() : false;
    }   
}

これを行うためのよりクールな方法は、ビジター パターンを実装することですが、この方法で問題ないと思います。

于 2012-06-20T10:26:03.303 に答える
0

を定義する Template method と、子クラスの実装によって動作が定義されます。

于 2012-06-20T10:26:41.790 に答える
0

メソッドがBaseITisValidオブジェクトを受け取り、TestA_IT拡張するようにしますBaseIT

于 2012-06-20T10:25:45.427 に答える