使用mockito模拟函数内的scala对象调用

使用mockito模拟函数内的scala对象调用,scala,mockito,specs2,Scala,Mockito,Specs2,我正在尝试测试以下函数 class someClass { def someMethod() = { val x = someObject.someOtherMethod() //some logic that i want to test } } 有没有一种方法可以在不传递x的情况下模拟val x或someOtherMethod调用呢?如果SomeObject确实是一个对象,我不相信有,除了一些反射黑魔法 一个常见的模式是拥有一个定义对象的公

我正在尝试测试以下函数

class someClass {
    def someMethod() = {
        val x = someObject.someOtherMethod()
        //some logic that i want to test 
    }
}
有没有一种方法可以在不传递x的情况下模拟val x或someOtherMethod调用呢?如果SomeObject确实是一个对象,我不相信有,除了一些反射黑魔法

一个常见的模式是拥有一个定义对象的公共方法的特性,并让对象扩展该特性

现在SomeClass可以依赖于SomeObject特性:例如

trait SomeObject {
  def someMethod: Unit
}

object SomeObject extends SomeObject {
  def someMethod = println("real method called")
}

class SomeClass(someObject: SomeObject)
在测试中,你可以模仿这种特质:

val mockObject = mock[SomeObject]
when(mockObject.someMethod).thenReturn(())
val someClass = new SomeClass(mock[SomeObject])
编辑:一些不安全的魔法

不幸的是,当Foo.length是def而不是val时,我无法实现这一点

import sun.misc.Unsafe

object Foo {
  val length: String => Int = {s => s.length}
}

Foo.length("foo") // 3

val unsafe = {
  val f = classOf[Unsafe].getDeclaredField("theUnsafe")
  f.setAccessible(true)
  f.get(null).asInstanceOf[Unsafe]
}

val offset = unsafe.objectFieldOffset(Foo.getClass.getDeclaredField("length"))
val doubleLength: String => Int = { s=> s.length * 2}
unsafe.putObject(Foo, offset, doubleLength)

Foo.foo("foo") // 6