Scalatest Scalamock ведет себя по-разному с той же функцией, объявленной двумя способами
Если у меня есть черта Scala с двумя определенными функциями, одна определена с использованием только сигнатуры def foo : Int => String
а другая функция объявлена с параметром и типом возврата def bar(myInt : Int): String
тогда я получаю другое поведение для этих методов.
import org.scalamock.scalatest.MockFactory
import org.scalatest.{Matchers, WordSpec}
class DefTest {
trait DefTrait {
def foo : Int => String
def bar(myInt: Int) : String
}
class DefTest extends WordSpec with Matchers with MockFactory {
val defStub = stub[DefTrait]
defStub.bar _ when * returns "Works"
defStub.foo _ when * return "nope"
}
}
IntellJ говорит, что есть Too many arguments for method when
а также expected: FunctionAdapter0[Boolean], actual: MatchAny
,
SBT говорит:
type mismatch;
[error] found : org.scalamock.matchers.MatchAny
[error] required: org.scalamock.function.FunctionAdapter0[Boolean]
[error] defStub.foo _ when * returns "nope"
[error] ^
Это заставляет меня задуматься:
- В чем разница между этими двумя типами объявлений функций? Я думал, что они эквивалентны, и я, кажется, был в состоянии использовать их взаимозаменяемо до сих пор.
- Можно ли использовать определение функции подписи
foo: Int => String
сdefStub.foo _ when 42 return "yay"
синтаксис?
1 ответ
1. В чем разница между этими двумя типами объявлений функций?
За def foo : Int => String
возвращает функцию высокого порядка без параметров принятия:
scala> :kind -v foo
scala.Function1's kind is F[-A1,+A2]
* -(-)-> * -(+)-> *
This is a type constructor: a 1st-order-kinded type.
и когда вы звоните foo(2)
это равно foo.apply(2)
, apply
Метод используется для выполнения функции.
За def bar(myInt: Int) : String
Это метод, который принимает Int
параметр.
2.Можно ли использовать определение функции подписи foo: Int => String с defStub.foo _, когда 42 возвращает синтаксис "yay"?
за def foo : Int => String
это не приемный параметр, поэтому вы должны использовать when()
для этого и возвращается тип Int => String
так что вы должны returns
функция высокого порядка для этого метода. лайк:
defStub.foo _ when() returns((i: Int) => "nope")