使用ScalaMock模拟带重载方法的Java泛型接口
模拟带有重载方法的Java泛型接口(ScalaMock实现)
嘿,我来帮你搞定用ScalaMock模拟这个Java泛型重载接口的问题!首先先把你提供的Java接口再贴一下,方便参考:
import java.util.concurrent.Callable; public interface GOInterface<T> { void send(T record); void send(T record, Callable<T> onComplete); }
接下来,我们可以在你的Scala测试类里完成mock的实现,核心是利用ScalaMock的参数类型匹配来区分两个重载的send方法。下面是完整的测试类代码,包含两个测试场景——分别验证单参数和双参数的send方法调用:
import java.util.concurrent.Callable import org.scalamock.scalatest.MockFactory import org.scalatest.{FlatSpec, Matchers} class JavaInterfaceTest extends FlatSpec with Matchers with MockFactory { "Mocked GOInterface" should "correctly handle the overloaded send method with Callable parameter" in { // 创建泛型类型为String的GOInterface mock实例 val mockGO = mock[GOInterface[String]] // 准备测试用的记录和Callable mock val testRecord = "sample-record" val mockOnComplete = mock[Callable[String]] // 针对双参数的send方法设置调用期望:指定参数类型来区分重载版本 (mockGO.send(_: String, _: Callable[String])) expects(testRecord, mockOnComplete) // 如果需要验证Callable的call方法被调用,可以添加这个期望 // (mockOnComplete.call _) expects() returning "completed-result" // 调用mock的双参数send方法 mockGO.send(testRecord, mockOnComplete) // 验证所有期望都被满足(ScalaMock会自动验证,显式调用verify更清晰) verify(mockGO) } it should "also handle the single-parameter send method" in { val mockGO = mock[GOInterface[Int]] val testRecord = 123 // 针对单参数的send方法设置调用期望 (mockGO.send(_: Int)) expects(testRecord) // 调用单参数send方法 mockGO.send(testRecord) verify(mockGO) } }
关键要点说明:
- 区分重载方法:ScalaMock通过参数的显式类型标注(比如
_: String)来识别不同的重载版本,这一点在处理Java重载接口时特别重要,避免歧义。 - 泛型处理:创建mock实例时直接指定泛型类型(如
mock[GOInterface[String]]),和Java接口的泛型定义保持一致即可。 - Callable的模拟:如果需要验证
onComplete回调的执行,可以单独mockCallable实例,并设置它的call方法的调用期望和返回值。 - 验证调用:ScalaMock会自动在测试结束时验证所有设置的期望是否被满足,也可以通过
verify(mockGO)显式触发验证,让测试逻辑更清晰。
内容的提问来源于stack exchange,提问作者Noam Shaish
相关产品推荐
相关产品推荐

