Grails: Как я издеваюсь над другими методами тестируемого класса, которые можно было бы назвать внутренне во время тестирования
Я пишу тест для метода A() в классе обслуживания, аналогичном приведенному ниже.
Class SampleService {
def methodA(){
methodB()
}
def methodB(){
}
}
Когда я тестирую метод A(), мне нужно быть в состоянии издеваться над вызовом метода B() при тестировании метода A(). Я использую версию 2.0.x grails. В дистрибутивах 1.3.x я бы написал сам макет, подобный этому
def sampleServiceMock = mockFor(SampleService)
sampleServiceMock.demand.methodB { -> }
Но это не работает в версиях 2.0.x. Мне было интересно, каковы другие способы издевательства метода B() при тестировании метода A()
Ответы
Ответ 1
Для этой проблемы я фактически избегаю издевательств и использую встроенную способность groovyProxy отображать карту замыканий в качестве прокси-объекта. Это дает вам экземпляр с некоторыми переопределенными методами, но другие передаются в настоящий класс:
class SampleService {
def methodA() {
methodB()
}
def methodB() {
return "real method"
}
}
def mock = [methodB: {-> return "mock!" }] as SampleService
assert "mock!" == mock.methodA()
assert "real method" == new SampleService().methodA()
Мне нравится, что только экземпляр меняет экземпляр, может выполняться в одной строке и не смешивается с метаклассом чего-либо вне этого экземпляра, который нужно очистить.
Ответ 2
Есть много насмешливых альтернатив с Groovy. Вы можете увидеть документацию Groovy Mocks, используя Closures вместо Mocks.
В вашем примере я буду использовать возможности метапрограммирования Groovy.
void testMethodA() {
service = new SampleService()
service.metaClass.methodB = { -> return "what you want" }
service.methodA()
assert "your condition"
}