Tôi đang cố gắng để thử một phương pháp gọi là có một đối số gọi-by-name:Làm thế nào để giả lập một phương thức với các đối số chức năng trong Scala?
import org.scalatest.WordSpec
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito._
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
trait Collaborator {
def doSomething(t: => Thing)
}
trait Thing
@RunWith(classOf[JUnitRunner])
class Test extends WordSpec with MockitoSugar {
"The subject under test" should {
"call the collaborator" in {
// setup
val m = mock[Collaborator]
val t = mock[Thing]
// test code: this would actually be invoked by the SUT
m.doSomething(t)
// verify the call
verify(m).doSomething(t)
}
}
}
tôi chủ yếu quan tâm đến việc Mockito vì đó là những gì tôi đang sử dụng, nhưng tôi muốn được quan tâm để xem liệu bất kỳ khung mock chính nào có khả năng thử nghiệm kiểu này. Các thử nghiệm thất bại khi chạy trên dòng verify
, với một lỗi như
Argument(s) are different! Wanted: collaborator.doSomething( ($anonfun$apply$3) <function> ); -> at Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:27) Actual invocation has different arguments: collaborator.doSomething( ($anonfun$apply$2) <function> ); -> at Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:24)
Nếu tôi hiểu tình hình một cách chính xác, trình biên dịch được ngầm gói t
trong một chức năng nullary trả t
. Khung giả lập sau đó so sánh hàm đó với hàm được tạo trong mã thử nghiệm, tương đương nhưng không phải là equals()
.
Trường hợp của tôi là một phiên bản tương đối đơn giản của vấn đề, nhưng tôi nghĩ đây sẽ là vấn đề với bất kỳ chức năng bậc cao nào.
Tôi không hiểu điều này liên quan đến iPad của Apple như thế nào. –
Bạn có thể mô tả cách nó không hoạt động rõ ràng hơn hoặc bao gồm một số mã thử nghiệm hay không. Thật khó để biết những gì đang xảy ra ở đây chỉ với xác minh được hiển thị. –
Tôi đã thực hiện các ví dụ runnable như bằng văn bản và bao gồm sản lượng thực tế liên quan đến sự thất bại. –