【发布时间】:2019-02-18 10:15:21
【问题描述】:
在特定情况下,您需要有一些跨不同类所需的实用方法。为了解决这种情况,您创建一个 Util 对象,在其中放置所有这些方法
object AggregatorUtil {
def aggregateValues(list : List[BigDecimal]) = //some logic...
}
// Import everything in the Utilities object
import AggregatorUtil._
然后导入类中需要的任何 util 成员。然而,这样做的缺点是,由于您的所有方法都在单例对象中,并且 使用实用方法模拟类的对象和单元测试方法变得很棘手。
为了再次解决这个问题,我想到的唯一解决方案是将功能提取到特征中,然后模拟特征。
如果还有其他方法可以处理和测试 util 方法,请告诉我,哪种方法更简洁。
提前致谢!!!
注意:-我在我的项目中使用 scalatest 和 mockito。
【问题讨论】:
-
为什么很难测试对象中的方法?或者您的意思是测试使用该
import AggregatorUtil._的方法 -
你为什么要在这里使用模拟?嘲笑本身并不是某种目标——有时它可能是一种必要的邪恶,但任何时候你都可以避免它,你绝对应该避免它。
-
我同意@TravisBrown,如果这些实用程序函数是经过适当测试的小实用程序、纯函数并在另一个方法中使用,那么就是一个私人调用,您的单元测试不应该知道它们存在。现在,如果它们是访问外部资源的依赖项或者它们进行一些复杂的计算,那么它们不应该被建模为对象中的实用程序,而是作为依赖项,这将是模拟的适当使用
-
我不同意“尽可能”避免嘲笑的观点。在没有任何外部依赖或复杂逻辑的情况下不模拟完全琐碎的东西当然是有意义的,但这只是常识。除此之外,我想说,应该模拟出可以模拟的一切。话虽如此,实际的问题听起来像是一个 XY 问题:
he only solution that came to mind was Extracting the functionality out to a trait- 你有解决方案,但正在要求另一个解决方案,甚至没有提及它有什么问题。只是好奇吗? -
@ChaitanyaWaikar 不,我认为,否决是因为基于意见的(又称“最佳实践”)和“好奇心”问题在这里是题外话。查看How To Ask,了解哪些问题被视为“好”。