[英]How to mock obj.&method in groovy/grails
下面的代碼。 我想使用obj。&method來傳遞對它的引用。 但是,在嘗試測試時,無法進行模擬。 我可以做一些測試來使其正常工作嗎?
運行測試的結果是它將引發異常“不應到達此處”。
import grails.test.mixin.TestFor
@TestFor(SomeController)
class SomeControllerTest {
void testSomething() {
def control = mockFor(SomethingElse)
control.demand.someMethod(1) { int num, String str, Map another, List param ->
println 'worked'
}
controller.obj = control.createMock()
controller.underTest()
control.verify()
}
}
class SomeController {
SomethingElse obj
void underTest() {
otherCall(obj.&someMethod) // **
}
void otherCall(toRun) {
String result = toRun(1, 'blah', null, null) // ** doesn't call mock here
}
}
class SomethingElse {
String someMethod(int num, String str, Map another, List param) {
throw new RuntimeException('should not get here')
}
}
是的,不要嘲笑SomethingElse
。 請改用ExpandoMetaClass
。
void testSomething() {
SomethingElse.metaClass.someMethod = {int num, String str, Map another,
List param ->
println 'worked'
}
controller.obj = new SomethingElse()
controller.underTest()
}
失去模擬控件的代價。
一種回旋方式也可以模擬otherCall()
void testSomething() {
def control = mockFor(SomethingElse)
control.demand.someMethod(1) { int num, String str, Map another,
List param ->
println 'worked'
}
def obj = control.createMock()
controller.metaClass.otherCall = {Closure clos ->
delegate.obj.someMethod(1, 'blah', null, null)
}
controller.obj = obj
controller.underTest()
control.verify()
}
這樣,您可以驗證模擬控件。 但是我仍然對將模擬對象和MethodClosure
一起使用持懷疑態度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.