7

我正在开发一个严重依赖Joda-Money的应用程序,并且有许多单元测试来验证我的业务逻辑。对我来说,一个(诚然是次要的)症结是要测试什么样的Money/BigMoney对象;具体来说,CurrencyUnit用什么。

在我看来,我有几个选择:

  • 只需使用USD

    这显然是最简单的方法,而且我的大部分实际应用程序都将使用美元,所以这很有意义。另一方面,它感觉相当以美国为中心,我担心它会冒着让特定于货币的错误不受控制的风险。

  • 使用另一种真实货币,例如CAD

    这将捕获错误的硬编码USD,但除此之外并不比仅使用USD.

  • 使用专用的“假”货币,即XTS

    这显然是有道理的,毕竟XTS是“保留用于测试”。但 Joda 将伪货币表示为带-1小数位的货币。实际上,Joda-Money 中货币之间的主要区别在于小数位数,因此这可能会掩盖任何涉及小数位精度的错误,例如错误地四舍五入为整数值。

  • 注册我自己的自定义货币CurrencyUnit.registerCurrency()

    这显然可行,但似乎有点奇怪,因为有替代方案。

  • 使用CurrencyUnit模拟库创建的实例

    与注册自定义货币几乎相同。

同样,这显然是一个小问题,但我很好奇这样的情况是否有标准做法,或者是否有明确的理由特别喜欢这些选项之一。

4

2 回答 2

4

使用美元(或者,一般来说,您的应用程序中最常用的任何货币)。我这么说有两个原因:

  • 好的测试数据在各个方面都没有什么特别之处,除了测试实际涉及的那部分。当您编写与货币之间的差异无关的测试时,您不想考虑货币之间的差异。只需使用应用程序中最自然的东西。

  • 到处使用不寻常的货币会以某种方式更好地测试不寻常的货币的想法是转移注意力。测试应该是明确的和有针对性的。如果您需要测试有关特定货币的某些内容,请编写一个旨在测试该内容的测试。如果测试不是关于特定货币的,那么在处理该货币中断的某些不寻常方面时它不应该中断——因为同样的原因让你的一半测试中断是没有价值的;你只想要一个打破。因此,没有必要在测试套件中散布不寻常的货币,并希望这会有所收获。相反,优化可读性;见第 1 点。

于 2015-03-12T02:31:48.700 回答
0

由于您的大多数应用程序都处理美元,因此将它们用于绝大多数测试是有意义的。您担心会发生哪些特定于货币的错误?复利时缺少半分钱?转换成日元和回来是一两美分?为此编写测试。

如果我是你,我会启动一个本地 REPL(如果你没有 JShell,Scala REPL 工作得很好),运行一些实验。你可能会发现自己担心什么。或者您可能会发现确实存在缺陷,并且您的 REPL 会话将告知您如何为该缺陷编写测试。

您使用 Joda Money 是因为您不想重新发明这个特定的轮子。直到我阅读了问题的详细信息,我才意识到这一点。据推测,Joda Money 已通过其开发人员的严格测试,并且可以满足您的期望。你不需要再次测试它。

但是,如果您要创建自己的类来表示金额,我建议您使用美元、欧元、日元和利比亚第纳尔 (LYD)。前三个原因很明显。由于小数点后三位,我建议使用利比亚第纳尔。据我所知,没有实物 1 迪拉姆硬币,因此,例如,513 darahim 将被四舍五入为 500 darahim,而 997 darahim 将被四舍五入为一个完整的第纳尔。

为了测试转换,我将从东加勒比元 (XCD) 开始,因为它们的汇率固定为 2.70 美元。稍后您可以担心货币之间的波动,以及您是否要通过模拟汇率服务器来处理它们,或者通过连接到实际汇率服务器但在您的测试中放置差异或通过其他方式来处理它们.

于 2020-09-27T20:47:50.467 回答