Подтвердить что ты не робот

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()

4b9b3361

Ответ 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"
}