我有一个特点,在它中实现了一些功能。我想模拟特性的方法,对于一种方法,我想使用thenCallRealMethod。我正在Scala中使用Mockito框架。但是,当我尝试对一个方法使用thenCallRealMethod时,我会得到以下错误:
不能对java对象调用抽象的实方法!只有在模拟非抽象方法时才能调用真正的方法。//正确示例: when(mockOfConcreteClass.nonAbstractMethod()).thenCallRealMethod();org.mockito.exceptions.base.MockitoException:
这是我的密码:
trait X{
def solve() : String = "solve"
def solve2() : String = "solve2"
}
class XTest extends FlatSpec with Matchers with MockitoSugar{
"test" can "test methods in trait" in{
val mockedX = mock[X]
when(mockedX.solve()) thenCallRealMethod()//this line throws the error
}
}此代码抛出错误。一种方法是使用可以扩展该特性的类,但我不想扩展该特性并寻找另一种方法。
发布于 2022-09-15 00:09:54
(我在将Scala2.13代码从JDK 11升级到JDK 17时遇到了这个问题)
正如您在评论中所说的,实际上您需要一个基本实现来调用另一个扩展方法:
trait X{
def solve() : String = "solution: " + solve2()
def solve2() : String
}(请用与实际问题类似的代码更新您的问题.)
正如@Dima所说,这违反了SRP。所以,制定一种有正确责任的方法。
object X {
def solve(x: X) : String = "solution: " + x.solve2()
}测试一下这个。由于您可能希望拥有流利的调用(以及方法的可发现性),因此从以下特性委托:
trait X{
def solve() : String = X.solve(this)
def solve2() : String
}对我来说,这属于“太简单而无法测试”的类别,并允许您保持其他代码的原样,同时保持逻辑分离以进行测试等。
https://stackoverflow.com/questions/67107696
复制相似问题