用不同的参数覆盖抽象方法?

时间:2012-06-20 10:19:40

标签: java junit

我想定义一个抽象方法,以便在我的抽象类中使用此方法。 然后,我想在不同的类中定义这个抽象方法来扩展我的抽象类。

但我怎么能这样做?

(目标是为集成测试提供一些基本方法,它们都使用相同的“结构”,但实现了一些不同的逻辑)。

如何在抽象类中定义一个抽象方法WITH参数,在抽象类中使用这个抽象方法,但是在我的测试实现中首先实现该方法?

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是不同测试用例实现的不同对象。

我可能不会使用接口。我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:0)

isValid方法接收一个BaseIT对象并使TestA_IT扩展BaseIT

答案 1 :(得分: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;
    }   
}

更酷的方法是实现一个访客模式,但我认为你会很好。

答案 2 :(得分:0)

您可以定义Template method,然后子类的实现将定义行为。

答案 3 :(得分:0)

你可以施展它:

((Class)o).isValid()

但我认为更好的方法是使用方法isValid()创建一个接口。并将所有这些对象实现到它。

答案 4 :(得分:0)

您的示例令人困惑,因为您显示的两个类没有继承关系。在您澄清这一点之前,您是否考虑过将isValid()方法设为通用和/或采用类型为isValid()方法的接口类型的对象?

无论如何,请远离涉及演员表或instanceof的解决方案。