首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Mockito测试用例中使用thenCallRealMethod测试特性方法?

如何在Mockito测试用例中使用thenCallRealMethod测试特性方法?
EN

Stack Overflow用户
提问于 2021-04-15 11:34:51
回答 1查看 317关注 0票数 0

我有一个特点,在它中实现了一些功能。我想模拟特性的方法,对于一种方法,我想使用thenCallRealMethod。我正在Scala中使用Mockito框架。但是,当我尝试对一个方法使用thenCallRealMethod时,我会得到以下错误:

不能对java对象调用抽象的实方法!只有在模拟非抽象方法时才能调用真正的方法。//正确示例: when(mockOfConcreteClass.nonAbstractMethod()).thenCallRealMethod();org.mockito.exceptions.base.MockitoException:

这是我的密码:

代码语言:javascript
复制
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
    }
}

此代码抛出错误。一种方法是使用可以扩展该特性的类,但我不想扩展该特性并寻找另一种方法。

EN

回答 1

Stack Overflow用户

发布于 2022-09-15 00:09:54

(我在将Scala2.13代码从JDK 11升级到JDK 17时遇到了这个问题)

正如您在评论中所说的,实际上您需要一个基本实现来调用另一个扩展方法:

代码语言:javascript
复制
trait X{
  def solve() : String = "solution: " + solve2()
  def solve2() : String
}

(请用与实际问题类似的代码更新您的问题.)

正如@Dima所说,这违反了SRP。所以,制定一种有正确责任的方法。

代码语言:javascript
复制
object X {
  def solve(x: X) : String = "solution: " + x.solve2()
}

测试一下这个。由于您可能希望拥有流利的调用(以及方法的可发现性),因此从以下特性委托:

代码语言:javascript
复制
trait X{
  def solve() : String = X.solve(this)
  def solve2() : String
}

对我来说,这属于“太简单而无法测试”的类别,并允许您保持其他代码的原样,同时保持逻辑分离以进行测试等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67107696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档