You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Mockito模拟Scala类中的方法以测试getFullName

在Scala中用Mockito模拟类内部方法

问题场景

我正在使用如下Scala类:

class names(lastName: String) {

  def getFullName(lastName: String): String = getPrivateName + lastName

  def getPrivateName: String = "amit"

}

(注:原代码中get_private_name应为笔误,修正为getPrivateName才能正常编译运行)

我需要测试getFullName方法,同时模拟类内部的getPrivateName方法。在Python中我会这么写:

def test_getPrivateName():
   with mock.patch(names.getPrivateName) as mocked_getPrivateName:
      names_cls = names("my_last_name")
      mocked_getPrivateName.return_value = "ido"
      self.assertEqual("idomy_last_name", names_cls.getFullName())

现在想在Scala中用Mockito实现同样的逻辑,求指导。

解决方案:用Mockito Spy做部分模拟

在Scala里,要模拟类自身的方法,得用Spy(部分模拟)——普通Mock是生成完全假的对象,而Spy能保留原类的大部分行为,只替换指定方法的实现,正好匹配你的需求。

1. 先加依赖

确保sbt里引入了必要的测试依赖:

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "3.2.15" % Test,
  "org.mockito" %% "mockito-scala" % "1.17.12" % Test,
  "org.mockito" %% "mockito-scala-scalatest" % "1.17.12" % Test
)

2. 编写测试用例

用spy创建原类实例,再用when指定模拟方法的返回值:

import org.scalatest.funsuite.AnyFunSuite
import org.mockito.MockitoSugar._

class NamesTest extends AnyFunSuite {

  test("getFullName uses mocked getPrivateName") {
    // 创建原类的Spy实例
    val namesInstance = spy(new names("dummy_last"))
    // 模拟getPrivateName返回"ido"
    when(namesInstance.getPrivateName).thenReturn("ido")
    
    // 调用getFullName并传入参数
    val result = namesInstance.getFullName("my_last_name")
    
    // 验证结果
    assert(result === "idomy_last_name")
  }
}

关键细节

  • Spy的优势:它不会完全替换整个类,只覆盖你指定的方法,这样getFullName的真实逻辑会被执行,只是内部调用的getPrivateName用了模拟值。
  • 避免真实方法执行:如果getPrivateName有副作用(比如读写文件),不想让它真实运行,可以改用doReturn语法:
    doReturn("ido").when(namesInstance).getPrivateName
    
  • 参数注意:你的getFullName方法需要接收lastName参数,测试时必须正确传入,否则会编译报错。

内容的提问来源于stack exchange,提问作者amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:00:08