云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

游戏服务器_远端服务器无响应_优惠

小七 141 0

我被要求重写一个相当重要的功能。在过去的几年里,许多不同风格的程序员对这个功能进行了大量的修改,尽管我编写了最初的版本。

因为我是从零开始的,所以我自然会使用测试驱动的开发方法。我是说-谁不会呢?由于各种原因,我无法更改任何现有的依赖类。至少,还没有……

我想记录的是我在开发新版本时遇到的具体问题,以及我是如何解决这些问题的。我正在使用eclipseoxygen进行开发。

问题

我遇到的第一个问题是一个包装用户维护的类(我们称之为CL\u SU01)。这是一段编写得很好的代码,但在我的测试中,我不想实际创建或维护任何用户。我在7.31上工作,所以我不能使用你在更高版本上得到的所有技术,这使得测试加倍变得更加容易。

解决方案

在我的"测试中的代码"类(这里称为我的CUT类)中,我创建了一个本地接口-lif\u su01,它具有我从CL\u su01中需要的相同方法定义(并且只有我需要的方法定义)和一个本地类。lcl\ U su01,它实现了lif\ U su01。最初,我的本地接口和类是空的,企业应用中心,除了lcl\ U su01有一个属性是CL\ U su01的实例,

当我构建代码时(write test,test,write code,test,修复…)我遇到(在修复阶段)需要调用CL\u SU01的方法。我将此添加到lif\u SU01的方法中,并在lcl\u SU01中实现,免费云服务器,本地类中的方法调用具有相同签名的CL\u SU01实例的相同方法。这些都写在的"本地类型"选项卡中剪切级

那我怎么打电话?

首先,我在CUT类的private部分创建了一个class属性,它将是lifèu su01的一个实例。但是lif\u su01对于CUT类是不可见的,所以在class-related-Local-Types选项卡中,我在CUT-class方法中添加了

在我需要用户信息的地方,我可以这样做(为了更清楚,我已经包含了class属性的定义:

lcl\u su01的方法exists与CL\u su01中的方法exists具有相同的签名,这是一个简单的传递调用。

现在lcl\ U su01不可见,所以在类相关的本地类型选项卡中,何为大数据,我添加了

这段代码已经完成,但是在我可以测试它之前,我需要一个测试双精度。

我在测试类选项卡中创建了类ltd\ U su01。我更喜欢在实际的单元测试之前进行测试。如果它真的很麻烦,那么将测试加倍放在它们自己的include中可能是一个好主意——但是我发现这会使导航变得复杂,并且使事情变得不那么明显。

这就是我的ltd\u su01类看起来的样子(与方法的存在相关)。

好的,现在我有了一个测试加倍,我可以将它用于我的单元测试方法。我将把它放在setup方法中,因为我可能永远不想在单元测试期间使用实际的CL\u SU01。

当test\u with \u existence运行时,method do\u something \u with \u userid将已经绑定到test double。所以它将是运行的test double的方法。它返回我在调用dosomething和userid之前设置的值。

至少。是这样的,返利app,但是还有另一个语法错误。我的测试类看不到CUT类的属性\u su01。

返回到类相关的本地类型选项卡,再添加两行。

现在我的测试类是CUT类的朋友,所有语法都是正确的,我可以安全地运行我的单元测试,因为我知道我不会更新系统上的任何用户帐户。

为了更清楚,感谢Jacques Nomssi Nzali,这是一个很好的UML图,展示了我所做的工作。

一些想法

另一种可能有效的方法,就是将test double定义为CL\u SU01的局部子类。这里的问题是依赖类可能被标记为FINAL,或者它可能有一个构造函数,它有你无法避免的尴尬的副作用,因为super->constructor必须从子类构造函数调用。

请注意,如果CL\u SU01是参照一个接口定义的,它会更简单-我不需要lif\u SU01或lcl\u SU01。从一个类中提取一个接口很容易,如果你为现在有接口前缀的组件使用别名,你保证不会破坏任何调用你的依赖类的东西

,物联网教室