scala - Scala 中编写和单元测试实用方法的良好实践
问题描述
在特定情况下,您需要有一些跨不同类所需的实用方法。为了解决这种情况,您可以创建一个 Util 对象,在其中放置所有这些方法
object AggregatorUtil {
def aggregateValues(list : List[BigDecimal]) = //some logic...
}
// Import everything in the Utilities object
import AggregatorUtil._
然后导入班级中需要的任何 util 成员。但是,这样做的缺点是,由于您的所有方法都在单例对象中,因此模拟使用实用方法的类的对象和单元测试方法变得很棘手。
为了再次解决这个问题,想到的唯一解决方案是将功能提取到特征中,然后模拟特征。
请让我知道是否有任何其他方法可以处理和测试 util 方法,以及哪种方法更简洁。
提前致谢 !!!
注意:-我在我的项目中使用 scalatest 和 mockito。
解决方案
如果您需要模拟,将所有这些都放在模拟特征中是前进的方向。如果嘲笑是不必要的,请避免它。不必要的嘲笑是……不必要的。你只会在没有额外价值的东西上浪费时间和精力。
当您希望将其他文件中的复杂功能或功能视为黑盒并假设它按预期工作时,最好使用模拟(然后您通常会单独对这些东西进行单元测试)。如果您可以避免它并使用函数的实际功能,您将更真实地了解您的应用程序的功能,并更快地发现新的错误/重大更改(如果您已经模拟了功能并且忘记更新您的模拟,你可能没有发现任何你引入的新错误)。
当您在 MVC 应用程序(例如 Scala Play 微服务)中模拟对数据库的调用时,需要进行模拟的一个很好的例子是。您显然不想在测试代码时运行实际的数据库,因此您通常会模拟连接器层并从连接器函数返回虚拟/模拟数据。
你不会嘲笑的一个例子是:
trait MyTrait {
def toInt(str: String): Int
}
val mockedTrait = mock[MyTrait]
when(mockedTrait.toInt(eq("3")).thenReturn(3)
这是一个有点愚蠢的例子,但我认为它清楚地解释了这一点——做这样的事情是荒谬的。嘲笑并不总是答案。
推荐阅读
- c# - 剃须刀页面中的NavigationManager.NavigateTo c#有时不起作用
- sql - 在 GROUP BY 中,有没有办法引用 SELECT 子句中名称与 FROM 子句中的列冲突的列?
- python-asyncio - aiokafka ProducerClosed 异步生成消息时出错
- arrays - 在 Julia 中求解 ODE 系统,初始条件为二维数组
- android - RenderScript 在 macOS Catalina (10.15) 上损坏
- vue.js - Vuetify 网格定位
- java - Java如何访问文本字段
- css - CSS:元素具有“显示:块”并且不开始新行
- angular - Angular Service Worker - 在 dist/styles.*.css 上 PurifyCSS 之后的哈希不匹配
- postgresql - 如何选择具有不同条件的同一列