首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ScalaMock模拟通用Java接口重载方法

ScalaMock模拟通用Java接口重载方法
EN

Stack Overflow用户
提问于 2018-04-25 12:32:57
回答 2查看 1.2K关注 0票数 0

我试图模拟具有不同数量参数的重载方法的Java泛型接口。接口代码是:

代码语言:javascript
运行
复制
import java.util.concurrent.Callable;

public interface GOInterface<T> {
    void send(T record);
    void send(T record, Callable<T> onComplete);
}

我尝试用onComplete功能来模拟发送,如下所示:

导入java.util.concurrent.Callable

代码语言:javascript
运行
复制
import org.scalamock.scalatest.MockFactory
import org.scalatest.{FlatSpec, Matchers}

class JavaInterfaceTest extends FlatSpec with Matchers with MockFactory {
  behavior of "scalamock"

  it should "mock java generic interface with overloaded method (with different number of parameters)" in {
    var result = ""
    val m = mock[GOInterface[String]]
    (m.send(_: String, _: Callable[String])).expects(*, *)
      .onCall{ case(s: String, c: Callable[String]) => c.call()}.once

    m.send("hello", new Callable[String] {
      override def call(): String = {result = "world"; result}
    })

    result should be("world")
  }


  it should "mock java generic interface with overloaded method (with different number of parameters) 2" in {
    var result = ""
    val m = mock[GOInterface[String]]
    (m.send(_: String)).expects(*).once

    m.send("hello")

    result should be("")
  }
}

我从编译器获得的错误是:

代码语言:javascript
运行
复制
error: value expects is not a member of (String, java.util.concurrent.Callable[String]) => Unit
[ERROR]     (m.send(_: String, _: Callable[String])).expects(*, *)
[ERROR]                                              ^

error: value expects is not a member of String => Unit
[ERROR]     (m.send(_: String)).expects(*).once
[ERROR]    

通过查看ScalaMock git上的不同示例,我可以看到没有使用具有不同param计数的重载方法检查泛型接口的测试。

我的依赖关系是:

代码语言:javascript
运行
复制
        <dependency>
            <groupId>org.scalamock</groupId>
            <artifactId>scalamock-scalatest-support_2.11</artifactId>
            <version>3.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.scalamock</groupId>
            <artifactId>scalamock-core_2.11</artifactId>
            <version>3.6.0</version>
            <scope>test</scope>
        </dependency>

同时,我在ScalaMock回购中创建了一个ScalaMock。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-07 08:13:19

我设法克服了这个问题。不是以最干净的方式,而是以最有效的方式。正如@PhilippM所建议的那样,我需要修复这个类型,但不幸的是,这还不够,我需要创建一个虚拟类。以下是为我工作的解决方案:

代码语言:javascript
运行
复制
class JavaInterfaceTest extends FlatSpec with Matchers with MockFactory {
  behavior of "scalamock"

  class StringInterface extends GOInterface[String] {
    override def send(record: String): Unit = ()

    override def send(record: String, onComplete: Callable[String]): Unit = ()
  }

  val call: (String, Callable[String]) => Unit = { case(s: String, c: Callable[String]) => c.call()}

  it should "mock java generic interface with overloaded method (with different number of parameters)" in {
    var result = ""
    val m = mock[StringInterface]
    (m.send(_: String, _: Callable[String])).expects(*, *)
      .onCall{ call }.once

    m.send("hello", new Callable[String] {
      override def call(): String = {result = "world"; result}
    })

    result should be("world")
  }


  it should "mock java generic interface with overloaded method (with different number of parameters) 2" in {
    var result = ""
    val m = mock[StringInterface]
    (m.send(_: String)).expects(*).once

    m.send("hello")

    result should be("")
  }
}

当更复杂的界面需要被嘲笑时,我觉得这有点丑陋,而且可能是最糟糕的,但我希望它能帮助其他人。

票数 1
EN

Stack Overflow用户

发布于 2018-05-06 10:41:50

首先,我建议升级到最新版本的ScalaMock,但泛型和重载方面的问题可能也存在。

为了解决这个问题,在许多情况下,首先锁定类型,然后创建一个模拟,这会有所帮助:

代码语言:javascript
运行
复制
trait StringGoInterface extends GoInterface[String]
val m = mock[StringGoInterface]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50022484

复制
相关文章

相似问题

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