当前位置: 首页 > 知识库问答 >
问题:

Scala测试:替换函数实现

许正平
2023-03-14

使用ScalaTest,我想替换测试用例中的函数实现。我的用例:

object Module {
  private def currentYear() = DateTime.now().year.get

  def doSomething(): Unit = {
    val year = currentYear()
    // do something with the year
  }
}

我想写一个单元测试模块。doSomething,但我不希望此测试用例依赖于测试运行的实际年份。

在动态语言中,我经常使用一个可以替换函数实现以返回固定值的构造。

我希望我的测试用例更改模块的实现。currentYear始终返回2014,无论实际年份是什么。

我发现了几个模拟库(Mockito、ScalaMock等等),但它们都只能创建新的模拟对象。它们似乎都无法取代方法的实现。

有办法做到吗?如果没有,我怎么能在不依赖于测试运行年份的情况下测试这样的代码?

共有2个答案

轩辕天佑
2023-03-14

ScalaMock可以模拟单例对象,它在这里说:http://paulbutcher.com/2011/11/06/scalamock-step-by-step/

除了特征(接口)和功能外,它还可以模拟:

班级

单一对象和伴生对象(静态方法)。。。

龚苏燕
2023-03-14

一种方法是让测试用例可以访问do_something_with_the_year(例如,让它包受保护)。这也很好,因为它将查找依赖关系和实际使用它们分开了。

另一种方法是将您的逻辑放在trait中,使currentYear方法受到保护,并让对象成为该trait的实例。这样,您就可以在测试中根据特性创建自定义对象,而不需要任何模拟库。

 类似资料:
  • 问题内容: Scala中有Java的替代品吗? 问题是Scala的数组不是协变的,所以我必须首先像这样转换我的: 有更好的解决方案吗? 问题答案: 据我所知,没有内置任何东西,但是您可以使用pimp-my-library模式相当容易地完成此操作。像这样: 您也可以将其他对象方法添加到同一类中。 总的来说,我发现习惯于始终导入自己喜欢的Scala实用工具的集合是一个好主意。添加这样的功能是如此容易,

  • 本文向大家介绍Linux 进程替换(exec函数)实现代码,包括了Linux 进程替换(exec函数)实现代码的使用技巧和注意事项,需要的朋友参考一下 Linux 进程替换(exec函数)实现代码 下图就是execl execlp execv execvp的结果图 下图是execle execve的结果图 感谢阅读,希望能帮助到大家,谢谢大家对对本知道支持!

  • 我有一个小型的spring boot 2.2批处理,它编写了一个OAuth2 REST API。 我已经能够按照https://medium.com/@asce4s/oauth2-with--webclient-761d16f89cdd配置并且它能够正常工作。 但是,现在我想为我的批处理编写一个集成测试,我想避免使用“真正的”授权服务器来获得一个令牌:如果一个外部服务器宕机,我不希望我的测试失败。

  • 11.2. 测试函数 每个测试函数必须导入testing包。测试函数有如下的签名: func TestName(t *testing.T) { // ... } 测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头: func TestSin(t *testing.T) { /* ... */ } func TestCos(t *testing.T) { /* ... */

  • 给定以下变量 我想使用以下代码将占位符${name}替换为值“joe”(这不起作用) 但是,如果我按照“老式”的方式来做,一切都运行得很完美: )我一定漏了点什么

  • 函数名称:字符串替换 函数功能:字符串替换 函数方法 str,num = string.gsub(s,pattern,repl,n) 参数 类型 必填 说明 s string/table/number 是 原字符串 pattern string/table/number 是 待查找的字符串或模式匹配 repl string/table/number 是 待替换的字符串 n number 否 替换次