Scalamock: как получить ожидания для моков прокси?

Я использую Scalamock со ScalaTest и пытаюсь издеваться над интерфейсом Java. В настоящее время у меня есть:

private val _iface = mock [MyInterface]

теперь я хочу сделать

_iface expects `someMethod returning "foo" once

Но компилятор не находит expects.

Я импортировал org.scalatest._ и org.scalamock.scalatest._. Что еще мне не хватает?


person rabejens    schedule 24.04.2015    source источник


Ответы (3)


Прежде всего, прокси-моки не очень хорошо поддерживаются в ScalaMock 3, и я думаю, что они будут полностью удалены в ScalaMock 4. Вам действительно нужно использовать прокси-моки вместо макросов?

Это должно работать:

package example

import org.scalatest.FlatSpec
import org.scalatest.Matchers
import org.scalamock.scalatest.proxy.MockFactory

trait MyInterface {
    def someMethod : String
}

class MyTest extends FlatSpec with Matchers with MockFactory {
  "MyInterface" should "work" in {
    val m = mock[MyInterface]
    m.expects('someMethod)().returning("foo")
    m.someMethod shouldBe "foo"
  }
}

Если нет, проверьте Прокси-сервер ScalaMock имитирует модульные тесты для получения дополнительных примеров.

person Pawel Wiejacha    schedule 25.04.2015
comment
Этот пример даже не находит mock. Теперь я придерживаюсь Mockito, когда мне нужна такая функциональность. - person rabejens; 27.04.2015
comment
@rabejens не нашел mock, потому что MyInterface не был определен в моем примере. Я обновил пример - он компилируется и работает со ScalaMock 3.2.x. Обратите внимание, что я смешиваю набор ScalaTest с org.scalamock.scalatest.proxy.MockFactory - person Pawel Wiejacha; 27.04.2015
comment
Я пытаюсь имитировать интерфейс Java с помощью этой техники, и даже когда я импортирую это и делаю mock[MyInterface], он не находит mock. - person rabejens; 27.04.2015
comment
@rabejens, пожалуйста, проверьте свой тест. Я удалил черту MyInterface, создал src/main/java/example/MyInterface.java, переместил свой тест в src/test/scala/example/MyTest.scala, и все заработало. Я использую scala-2.11.1 и ScalaMock-3.2.2. - person Pawel Wiejacha; 27.04.2015
comment
Я дважды проверил это. Я даже скопировал твой код и там тоже не находит mock. Может быть, это потому, что я строю с Maven и пропускаю некоторые зависимости. Какие зависимости вы указали, чтобы это работало? Сейчас у меня org.scalatest:scalatest_2.11, org.scalamock:scalamock-core_2.11 и org.scalamock:scalamock-scalatest-support_2.11. - person rabejens; 27.04.2015
comment
org.scalamock:scalamock-scalatest-support_2.11 должно быть достаточно. @rabejens Я только что создал для вас суть: gist.github.com/99b61345630a0beacd4d.git - состоит всего из 3-х файлов. Вы можете клонировать его, переместить два файла в нужные папки (к сожалению, у gists не может быть подпапок) и запустить sbt test. Это будет работать. Затем вы экспериментируете с минимальным pom.xml, чтобы этот пример работал под maven. - person Pawel Wiejacha; 27.04.2015
comment
Ваша ссылка просто возвращает пустую страницу. - person rabejens; 27.04.2015
comment
используйте 1_ :) - person Pawel Wiejacha; 27.04.2015

Я думаю, что это должно быть что-то вроде:

import org.scalamock.scalatest.MockFactory

class MyTest extends FlatSpec with Matchers with MockFactory {
  "MyInterface" should "work" in {
    val m = mock[MyInterface]
    (m.someMethod _).expects().returning("foo")
    m.someMethod shouldBe "foo"
  }
}

Я думаю, что аргумент ожидает, что аргумент ожидает функцию

person vinh    schedule 06.03.2016

Я использую scalaMock версию 4.1.0, у меня работает:

По какой-то черте:

trait MyInterface { def someMethod(n1: Int, n2: Int) }

Это должно быть помещено в тест

val myInterfaceMock = mock[MyInterface]

myInterfaceMock.someMethod _ expects (1,2)

Дополнительные материалы: руководство по scalaMock, там вы найдете несколько примеров

person Aaron_ab    schedule 19.02.2019