ScalaMock насмешливый универсальный перегруженный метод интерфейса Java - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь смоделировать универсальный интерфейс Java с перегруженным методом с различным количеством параметров.Код интерфейса:

import java.util.concurrent.Callable;

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

Я пытаюсь смоделировать отправку с помощью функции onComplete следующим образом:

import java.util.concurrent.Callable

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("")
  }
}

ОшибкаЯ получаю от компилятора:

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 Я вижу, что не существует теста, который проверял бы универсальный интерфейс с перегруженным методом с различным количеством параметров.

Мои зависимости:

        <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.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Мне удалось преодолеть эту проблему. не самым чистым способом, но это работает. Как @PhilippM предположил, что мне нужно исправить тип, но, к сожалению, этого было недостаточно, мне нужно было создать фиктивный класс. вот решение, которое работало для меня:

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("")
  }
}

Я нахожу это немного уродливым, и это может быть хуже, когда нужно смоделировать более сложные интерфейсы, но я надеюсь, что это помогает другим.

0 голосов
/ 06 мая 2018

Прежде всего, я бы предложил обновить ее до последней версии ScalaMock, но здесь, вероятно, существуют и угловые случаи, связанные с генериками и перегрузками.

Чтобы обойти это, во многих случаях сначала помогает заблокировать тип, а затем создать макет:

trait StringGoInterface extends GoInterface[String]
val m = mock[StringGoInterface]
...