Questions tagged «adapter»

6
如何测试难以模拟对象的系统?
我正在使用以下系统: Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern 最近,我们遇到了一个问题,即我更新了所使用的库的版本,这尤其导致时间戳(第三方库返回该时间戳long)从时期后的毫秒数更改为时期后的毫微秒。 问题: 如果编写模拟第三方库对象的测试,则如果我对第三方库的对象犯了错误,则我的测试将是错误的。例如,我没有意识到时间戳会改变精度,这导致需要更改单元测试,因为我的模拟返回了错误的数据。这不是库中的错误,它的发生是因为我错过了文档中的某些内容。 问题是,我无法确定这些数据结构中包含的数据,因为如果没有真实的数据馈送,我将无法生成真实的数据。这些对象又大又复杂,并且其中包含许多不同的数据。第三方库的文档很差。 问题: 如何设置测试以测试此行为?我不确定我可以在单元测试中解决此问题,因为测试本身很容易出错。另外,集成系统又大又复杂,容易遗漏一些东西。例如,在上述情况下,我已经在几个地方正确地调整了时间戳记处理,但是我错过了其中之一。在我的集成测试中,该系统似乎在做正确的事情,但是当我将其部署到生产环境(具有大量数据)时,问题变得很明显。 我目前没有集成测试过程。测试本质上是:尝试保持单元测试良好,在出现问题时添加更多测试,然后部署到我的测试服务器并确保一切正常,然后部署到生产中。这个时间戳问题通过了单元测试,因为模拟创建错误,然后通过了集成测试,因为它没有引起任何直接的,明显的问题。我没有质量检查部门。

4
我应该如何向已存在的对象添加功能?
我有一个具有一定数量明确定义的功能的接口。比方说: interface BakeryInterface { public function createCookies(); public function createIceCream(); } 这对于大多数接口实现都很有效,但是在某些情况下,我需要添加一些新功能(例如,可能已添加到新方法中createBrownies())。这样做的显而易见/天真的方法是扩展接口: interface BrownieBakeryInterface extends BakeryInterface { public function createBrownies(); } 但是有一个很大的缺点,就是我不能在不修改现有API的情况下添加新功能(例如,更改类以使用新接口)。 我正在考虑使用适配器在实例化后添加功能: class BrownieAdapter { private brownieBakery; public function construct(BakeryInterface bakery) { this->brownieBakery = bakery; } public function createBrownies() { /* ... */ } } 这会让我感到类似: bakery = new …

1
单元测试API客户端和包装器
我一直在兜圈子,试图找出对我正在开发的API客户端库进行单元测试的最佳方法。该库具有一个Client基本上与API进行1:1映射的Wrapper类,以及一个额外的类,该类在的顶部提供了更加用户友好的界面Client。 Wrapper --> Client --> External API 我首先针对Client和编写了一系列测试Wrapper,实际上只是测试它们是否转发到操作的任何适当功能(Wrapper在上操作Client,并Client在HTTP连接上操作)。但是,我开始对此感到不舒服,因为我感觉自己正在测试这些类的实现,而不是接口。从理论上讲,我可以将这些类更改为具有另一个完全有效的实现,但是我的测试将失败,因为未调用我希望调用的函数。对我来说,这听起来像是脆弱的考验。 之后,我考虑了类的接口。测试应该验证类是否确实完成了其应做的工作,而不是他们是如何完成的。那我该怎么做呢?首先想到的是对外部API请求进行存根。但是,我担心过度简化外部服务。我见过的很多存根API的示例都给出了罐头响应,这听起来像是一种非常简单的方法,可以仅测试您的代码是否针对假API正确运行。另一种方法是模拟服务,这是不可行的,并且每当真实服务发生变化时就需要保持最新状态-感觉像是过分杀伤和浪费时间。 最后,我从程序员SE的另一个答案中读取了此内容: 远程API客户端的工作是发出某些调用-不多也不少。因此,它的测试应验证它是否发出了这些呼叫-不多也不少。 现在,我或多或少地确信-测试时Client,我需要测试的是它向API发出了正确的请求(当然,总有API会更改但我的测试继续通过的可能性-但这就是集成测试很有用的地方)。由于Client与API只是1:1的映射,因此在将一个有效实现更改为另一个之前,我的担心并没有真正适用-的每种方法只有一个有效实现Client。 但是,我仍然坚持Wrapper上课。我看到以下选项: 我对Client类进行存根处理,然后测试是否调用了适当的方法。这样,我做的与上述相同,但是将其Client作为API的替代。这使我回到了起点。再一次,这给了我测试实现而不是界面的不舒服的感觉。将Wrapper很可能使用了完全不同的客户端实现。 我创建一个模拟Client。现在,我必须决定对它进行模拟的程度-创建服务的完整模拟将花费很多精力(比库本身要付出更多的工作)。API本身很简单,但是服务却很复杂(本质上是一个对数据进行操作的数据存储)。再说一次,我将必须使模拟与real保持同步Client。 我只是测试是否正在发出适当的HTTP请求。这意味着Wrapper将通过一个真实的Client对象进行调用以发出这些HTTP请求,因此我并不是在单独测试它。这使得它有点可怕的单元测试。 因此,我对这些解决方案都不满意。你会怎么做?有正确的方法去做吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.