Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试辅助方法?_Java_Unit Testing_Junit_Jmock_Helpermethods - Fatal编程技术网

Java 单元测试辅助方法?

Java 单元测试辅助方法?,java,unit-testing,junit,jmock,helpermethods,Java,Unit Testing,Junit,Jmock,Helpermethods,我的类以前有大量的方法,所以我将这个方法的工作细分为“helper”方法 这些helper方法被声明为private,以强制封装-但是我想对大型公共方法进行单元测试。单元测试helper方法是否也很好,就好像其中一个失败了一样调用它的公共方法也会失败,这样我们就可以确定它失败的原因了 也为了使用模拟对象来测试这些对象,我需要将它们的可见性从私有变为受保护,这是可取的吗?< p>如果要测试助手方法,可以将它们从私有更改,但可以考虑这个。 您不应该对实现的私有细节进行单元测试,主要是因为它可能会因重

我的类以前有大量的方法,所以我将这个方法的工作细分为“helper”方法

这些helper方法被声明为
private
,以强制封装-但是我想对大型公共方法进行单元测试。单元测试helper方法是否也很好,就好像其中一个失败了一样调用它的公共方法也会失败,这样我们就可以确定它失败的原因了

也为了使用模拟对象来测试这些对象,我需要将它们的可见性从私有变为受保护,这是可取的吗?

< p>如果要测试助手方法,可以将它们从私有更改,但可以考虑这个。


您不应该对实现的私有细节进行单元测试,主要是因为它可能会因重构而改变,并“破坏”您的测试

一种方法是省略
private
,将测试放在同一个包中。然后,测试可以调用内部方法,但没有其他(=包外)可以


此外,失败的内部方法应该会产生错误消息,从而很容易解决问题。当您将代码投入生产时,您将看到比测试更少的代码,并且您将面临快速修复问题的巨大压力。因此,花一分钟在这里可以节省一个小时的时间,让你的老板坐在你的脖子上。

你基本上有两个选择:

  • 将助手方法的范围从private增加到default。然后可以测试这些方法(假设测试类与测试主题位于同一个包中)。这提高了类的可测试性,但牺牲了一些封装

  • 让一切保持原样。这将阻止您编写非常细粒度的测试,但不需要牺牲任何封装

  • 就个人而言,我会选择(2),因为您不应该真正需要测试私有方法。应该通过类的公共接口(该接口将调用私有方法)来测试该类。测试私有方法可能会导致脆性测试,即只有类的内部行为发生变化时测试才会失败


    还有第三种选择(我不愿意提及):使用反射(或其他巫毒)在测试类中调用私有方法。这有(1)的缺点,也有反射代码固有的缺点(例如,绕过类型检查,难以阅读)

    正如Don和Dror所说,将这些方法公开以便您可以为它们创建单元测试会破坏封装。然后您将自己绑定到一个特定的实现。通过公开这些方法,您向世界宣布这些方法是已发布接口的一部分,因此它们的规范被锁定


    就我个人而言,我会选择一个更实用的解决方案:保持它们的私有性,不要编写单元测试。如果你遇到一个公共方法失败的情况,你不知道为什么,但你认为它可能是你的一个私有方法中的一个问题,那么暂时将它们公开,编写单元测试,调试,完成后,将它们私有化获取并注释掉单元测试。

    这闻起来好像你有错误的问题。你所描述的类似于创建一个子“单元测试”,这让我相信你的单元测试毕竟是在测试一个单元

    这并不是对你试图做的事情的批评:从“今天的我们”到“其他更好的地方”这是一个成功的举动。然而,这是一个建议,你退后一步,评估一下你现在的处境——了解你目前的处境与柏拉图式的理想有什么不同,有助于展示新的可能性

    关于确定助手方法的范围,这里有很多建议。另一种可能是查看实现,以确定当前实现中是否隐藏有助手类。创建一个新类和一组测试来执行它总是可以接受的

    请注意,这种方法将您与重构隔离开来:您可以在不更改测试套件的情况下更改实现(因为即使helper对象不再是生产实现的一部分,helper对象的单元测试也会继续通过),并且您可以获得实现和测试的干净打包(用例:您确定bozo sort是错误的实现,不应再使用。如果bozo sort实现是隔离的,那么您只需删除它及其测试。但是当bozo sort实现的测试与所有其他测试纠缠在一起时,需要更多的思考)


    回顾一下为什么要对代码进行单元测试也会有所帮助。如果其中一个原因是“确保重构安全”,那么您就不想编写将您锁定在实现中的测试。

    这就是我要说的违反规则的情况之一

    如果你是从头开始设计这个类,你肯定不想让助手方法自己进行单元测试,但是……因为你正在重构一个现有的类,所以为了确保你不破坏任何东西而改变规则是可以接受的

    使它们受到保护可以让您自己测试助手,以确保它们在从big hairball方法中提取逻辑时仍具有您所期望的行为,并允许您将它们剔除并返回固定的响应,这样您就可以确保重构的big方法的行为符合特定结果的预期助手方法

    但此时您还没有完成。将该方法拆分并不是真正解决问题的根本。现在您已经将该方法拆分并创建了一组(稍微非正统的)如果测试能够准确地显示所有逻辑的作用,那么您就可以重新检查整个类,并尝试找出为什么该方法在一开始就这么大。很可能您的整个类也需要分解为