2015-03-04 1 views
5

Для простоты давайте рассмотрим очень простой класс:Получение «Слишком мало вызовов» на модульного тестирования с Спока

public class TestingClass { 

    public void method1(){ 
     System.out.println("Running method 1"); 
     method2(); 
    } 

    public void method2(){ 
     System.out.println("Running method 2"); 
    } 
} 

Сейчас я пишу простой тест, который проверяя, что, когда мы вызываем method1(), method2() вызывается:

class TestingClassSpec extends Specification { 
    void "method2() is invoked by method1()"() { 
     given: 
     def tesingClass = new TestingClass() 

     when: 
     tesingClass.method1() 
     then: 
     1 * tesingClass.method2() 
    } 
} 

, выполнив этот тест, я получаю следующее сообщение об ошибке:

Running method 1 Running method 2

Too few invocations for:

1 * tesingClass.method2() (0 invocations)

Почему Я получаю эту ошибку? Печатный журнал показывает, что метод method2() был вызван.

ответ

3

Вы должны использовать Spy при тестировании взаимодействия на реальных объектах, смотрите ниже:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class TestingClassSpec extends Specification { 
    void "method2() is invoked by method1()"() { 
     given: 
     TestingClass tesingClass = Spy() 

     when: 
     tesingClass.method1() 

     then: 
     1 * tesingClass.method2() 
    } 
} 

public class TestingClass { 

    public void method1(){ 
     System.out.println("Running method 1"); 
     method2(); 
    } 

    public void method2(){ 
     System.out.println("Running method 2"); 
    } 
} 
+0

Здравствуйте Opal, спасибо за ваш ответ. Да, я знаю, что могу использовать Spy, и он работает отлично. Я хочу понять, что такое логика, что этот код с реальным объектом не работает. –

+0

@AramAslanyan это не сработает, потому что вам нужно сфокусировать вызовы на любом уровне - чтобы проверить вызовы, вы должны использовать шпионы или издевки, вот как работает тестирование взаимодействия. Вам нужно каким-то образом обернуть реальный объект с помощью предоставленных инструментов. Это ясно? – Opal

Смежные вопросы