暴露内部功能的设计模式(为了外部测试)

Design pattern of exposing internal functions (for the sake of external testing)

提问人:goodvibration 提问时间:12/14/2017 最后编辑:halfergoodvibration 更新时间:11/21/2020 访问量:52

问:

我有一个类,需要测试它的一些内部功能。

我不想将这些测试嵌入到类中,因为它们只能由某些外部实体使用,其唯一目的是进行系统验证。

我对此的解决方案是 声明这些内部函数 ,并添加一个类来“公开”它们以供外部使用。protected

下面是一个非常简单的(伪代码)示例:

class public MyClass {

    protected int add(int val1, int val2) {
        return val1 + val2;
    }

    protected int mul(int val1, int val2) {
        return val1 * val2;
    }
}

class MyClassExposurer : public MyClass {

    public int addTest(int val1, int val2) {
        return super.add(val1, val2);
    }

    public int mulTest(int val1, int val2) {
        return super.mul(val1, val2);
    }
}

此设计模式是否有已知的术语?

OOP 设计模式 与语言无关

评论

0赞 Binary Baba 12/14/2017
测试私有或受保护的方法没有意义。因为当您测试公共方法时,它们会自动进行测试。
1赞 goodvibration 12/14/2017
@RickSanchez:有,因为我想指出一个问题,如果存在这样的问题。当我运行外部函数时,这个问题可能被“很好地隐藏”了。
0赞 Binary Baba 12/14/2017
您可以使用反射。
0赞 goodvibration 12/14/2017
@RickSanchez:我目前的实现(类似于上面的编码示例)工作正常。反射是一种更好的方法,还是我应该在实现中用作命名约定的实际术语?
0赞 Binary Baba 12/14/2017
绝对不建议仅仅为了测试私有方法而公开类。如果您使用的是 JUnit,请检查注解@VisibleForTesting,或者要进行反射,请阅读此 stackoverflow.com/a/34658/1749223

答:

0赞 floppy12 12/15/2017 #1

您正在为您使用的“设计模式”寻找一个名称:我会说适配器代理之间的混合。它可以工作,可以保持原样。

更让我困扰的是,使用该解决方案,您被迫复制一个类只是为了更改暴露级别,而您可以考虑使用关键字 friend 来允许您的测试类直接访问私有方法,并且具有不修改测试类(私有)的初始封装级别的额外优势。