外部类的Scala参数捕获

外部类的Scala参数捕获,scala,mockito,Scala,Mockito,所以我想检查发送给我不控制的外部类的参数。假设外部类已测试,我只想测试我是否向它传递了正确的参数。我尝试了一些ArgumentCaptor等组合,但运气不太好 import org.ABC.ExternalClass case class Foo(i:Int, j: Int...) { val EC = CreateExternalClass() def CreateExternalClass(): ExternalClass = { new ExternalClass (i,

所以我想检查发送给我不控制的外部类的参数。假设外部类已测试,我只想测试我是否向它传递了正确的参数。我尝试了一些ArgumentCaptor等组合,但运气不太好

import org.ABC.ExternalClass

case class Foo(i:Int, j: Int...) { 
  val EC = CreateExternalClass()
  def CreateExternalClass(): ExternalClass = {
   new ExternalClass (i, j, ....many parameters)
  } 
}

我认为您在这里弄错了:您只能在调用模拟对象时使用ArgumentCaptor。您不能使用它们来“拦截”各种对象之间的任意调用


意思:如果要使用模拟的外部类对象,则只能使用ArgumentCaptor。但这样您就不需要捕获,因为您可能只需要进行方法调用参数验证

但是,当然,您不能在生产类中使用Mockito来模拟对
new
的调用。您可以选择:

  • 转向PowerMockito或JMockit;框架,允许模拟对新对象的调用。不推荐
  • 将生产代码返工为而不是,然后调用new。在这里可能没有帮助;因为这个类可能已经是外部类的包装器了
  • 检查创建的对象:检查是否可以使用getter方法简单地查询新创建的对象,以获得希望在其中显示的值

请提供一份真实的报告。当您使用捕获器编写代码时,请展示并描述哪些不起作用。现在你只抛弃了需求;没有证据表明你试图自己解决这个问题。谢谢你及时接受!“意思是:如果您要使用模拟的ExternalClass对象,则只能使用ArgumentCaptor。但这样您就不需要捕获,因为您可能只需要进行方法调用参数验证。”。。那么ArgumentCaptor的用例是什么呢?若我只能在模拟对象上使用它,但若它是模拟的,我无论如何都可以进行简单的方法调用参数验证,那个么我什么时候使用它呢?同样,通过简单的方法调用参数验证,您指的是类似“when-when(mock.Function)(any(“foo”)。thenReturn(“bar”)这样的构造?例如,请参阅。要点是:捕获更复杂,但它允许您执行高级验证步骤。您可以稍后对先前捕获的值进行断言。但如上所述,它增加了很多复杂性。当我开始思考“我需要捕获”时,我的下一个想法是“我应该改进我的生产代码,这样我就可以更好地测试它,而无需捕获”。