You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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回调的执行,可以单独mock Callable实例,并设置它的call方法的调用期望和返回值。
  • 验证调用:ScalaMock会自动在测试结束时验证所有设置的期望是否被满足,也可以通过verify(mockGO)显式触发验证,让测试逻辑更清晰。

内容的提问来源于stack exchange,提问作者Noam Shaish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:21:36