如何用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
相关产品推荐
相关产品推荐

