Передача макета, созданного с помощью Groovy's MockFor в качестве ссылки - PullRequest
2 голосов
/ 08 марта 2011

Я пытаюсь дополнить существующий Java-проект некоторым Groovy, начиная с тестов.Итак, допустим, у меня есть ServiceA (класс Java), который зависит от ServiceB (другой класс Java);это передается как ссылка в конструкторе:

public class ServiceA {

   private ServiceB serviceB;

   public ServiceA(ServiceB seviceB){
       this.serviceB = serviceB;
   }

   public boolean doSomeWork(){
       //some logic
       return  serviceB.doMoreWork();
   }
}

Предположим, что serviceB.doMoreWork () возвращает true.

Чтобы протестировать ServiceA, я хочу смоделировать ServiceB с помощью MockFor

@Test
void testDoSomeWork(){
    def mocker = new MockFor(ServiceB) //1 create the Mock support
    mocker.demand.doMoreWork(2){ //2 twice for this demonstration
         false //3 return other value than in real code
    }
    mocker.use {
        def mockServiceB = new ServiceB() //4 creates mock instead of real one
        assert !mockServiceB.doMoreWork() //5 that's good!
        def serviceA = new ServiceA(mockServiceB)
        assert !serviceA.doSomeWork() //6 that fails! Real implementation called!
    }
}

Как видите, тот же объект действует как макет в # 5 и как реальный объект в # 6.Я предполагаю, что это как-то связано с тем, что это Java Object, а не GoovyObject.Что дает?

Спасибо!

Варух.

1 Ответ

1 голос
/ 08 марта 2011

1) Следующее понимание неверно:

def mockServiceB = new ServiceB () // 4 создает макет вместо реального

Вы не создаете макет здесь.Вы создаете реальный объект.Это метод отправки, который Groovy направляет по-разному.

2) В приведенном ниже коде Groovy заботится о маршрутизации вашего вызова doMoreWork () в mock-версию, потому что «new MockFor (ServiceB) .demand.doMoreWork» дает Groovyинформация о том, что есть реализация с заглушкой doMoreWork ()

def mocker = new MockFor (ServiceB) mocker.use {mockServiceB.doMoreWork ()}

Итак, вышеуказанная магия работает, когда mockServiceB.Вызов doMoreWork () выполняется из Groovy.

Когда тот же вызов выполняется из Java, он не проходит через инфраструктуру MOP Groovy, поэтому он напрямую переходит к реальной реализации doMoreWork ()

Помните: для MockFor Groovy не выполняет никаких инструкций байт-кода и т. Д., Так что измененный класс также виден в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...