3

假设我的班级有 3 个方法:

public void parent() throws Exception {}
public String child_1(String arg_1) throws IOException {}
public boolean child_2(String arg_1, String arg_2) throws SQLException {}

parent()调用child_1()and child_2(),例如:

public void parent() throws Exception {
    // Do some complicated stuff

    child_1("str1");

    // More stuff

    child_2("str1", "str2");

    // More stuff
}

现在,如果我已经测试了 child_1() 和 child_2() 并且我只想测试 parent(),是否可以覆盖 child_1() 和 child_2() 并只测试 parent()?像这样的东西:

MyClass myClass = new MyClass() {
    @Override
    public String child_1(String arg_1) throws IOException {
        return "expected_string_to continue_execution";
    }

    @Override
    public boolean child_2(String arg_1, String arg_2) throws SQLException {
        return true;    // return expected boolean result to continueexecution;
    }
};

myClass.parent();

通过这样做,我可以轻松地测试我的 parent() 并且由于 child_1() 和 child_2() 已经在该课程的其他单元测试中进行了测试,它不会做任何作弊(至少我是这么认为的,如果我想请纠正我我错了)。此外,在现实世界中,如果 chaild_1() 和 child_2() 正在做一些复杂的事情,这种方法使测试变得容易,我们不会重复检查耗时的代码。

我的问题是,这是否是正确的方法?如果不是,那么缺点是什么,最重要的是,正确的方法是什么?如果有人可以用上面相同的例子来解释,那就太棒了。

非常感谢。

4

2 回答 2

3

我想说重写方法是您通常应该避免的事情,因为它很可能违反了Liskov 替换原则。测试代码没有什么特别之处:它应该遵循与生产代码相同的严格原则。我能想到的唯一例外是,如果您正在测试组件之间高度耦合的遗留代码,并且覆盖是唯一的选择。但是在编写新代码时,我看不到任何理由。

我认为@samlewis 正在做一些事情:如果您觉得parent()出于某种原因想要单独进行测试,那么child_1()并且child_2()可能应该在自己的类中注入parent(). 避免测试任何小于类的东西。如果你需要测试一些更小的东西,你可能有一个想要被提取的责任(单一责任原则)。

暗示child_1()并且child_2()实​​际上属于其他类的是它们是公共的并且公共方法parent()调用它。公共方法通常应该只调用非公共方法(尽管可能有例外)。

或者您是否公开了子方法以便您可以测试它们?如果是这样,看看这个答案

于 2013-07-24T06:13:13.880 回答
1

是否真的从外部消耗,或者您是否将它们公开以便您可以测试它们child_1()child_2()

正如 Torbjörn 指出的那样,很少看到一个公共方法在同一个实例上调用 2 个其他公共方法。子方法通常包含类内部的行为,不应向外界公开。它们的名称通常反映了与面向公众的类合同不同的语言级别——它们用对象自己的专用术语来表达。

假设您可以制作child_1()child_2()私有,您不必显式测试它们,它们将通过测试间接parent()测试。

于 2013-07-24T12:09:09.540 回答