Спок Тестирование: слишком мало вызовов - PullRequest
0 голосов
/ 02 февраля 2019

Я пишу тест Спока для класса Service, метод которого вызывает другой метод в классе Dao в приложении весенней загрузки.Однако я получаю:

 Too few invocations for:
 1 * dao.getAddressFromSomewhere("me")   (0 invocations)
 Unmatched invocations (ordered by similarity):
 None

Ниже приведен исходный код и код тестирования, может кто-нибудь сообщить мне, что я сделал не так?Кажется, что дао-издевательство вообще не вызывалось и не возвращало «США».Я провел онлайн-исследование и не могу найти, что я сделал неправильно.

@Service
public class ServiceClass 
{
    @Autowired
    private DaoClass dao;

    public String getAddress(String name) {         
        return dao.getAddressFromSomewhere(name);
    }
}

@Component
public class DaoClass {
     public String getAddressFromSomewhere(String name) {
     // get address from DB
     ......
     }
}

А вот мой код тестирования Спока:

@ContextConfiguration
@Import(ServiceClass.class)
public class Test extends Specification {

@Autowired
private DaoClass dao;
@Autowired
private ServiceClass service;

@TestConfiguration
static class MockConfig {
    def detachedMockFactory = new DetachedMockFactory()
    @Bean
    DaoClass dao() {
        return detachedMockFactory.Mock(DaoClass)
    }
}

def "Test Success Senario"() {                     
    given: "dao"
          dao.getAddressFromSomewhere("me") >> "USA";

    when: "call service "
       def actualResponse = service.getAddress("me");

    then: "dao should be invoked with given response"
       1 * dao.getAddressFromSomewhere("me")
       actualResponse == "USA"
 }
}

1 Ответ

0 голосов
/ 02 февраля 2019

Записывая 1 * dao.getAddressFromSomewhere("me") в блоке then:, вы просто переопределяете взаимодействие dao.getAddressFromSomewhere("me") >> "USA" в блоке given:.И не объявляя возвращаемое значение через >>, вы просто указываете макету возвращать null.Порядок взаимодействий можно проверить с помощью Spock doc :

... Взаимодействия, объявленные в блоке then:, сопоставляются перед любыми другими взаимодействиями.Это позволяет переопределять взаимодействия, объявленные, скажем, в методе установки, с взаимодействиями, объявленными в блоке then:

Вы можете переписать свой пример несколькими способами:

  1. Объявите ваше взаимодействие в given: блоке
def "Test Success Senario"() {
    given: "dao"
    1 * dao.getAddressFromSomewhere("me") >> "USA"

    when: "call service "
    def actualResponse = service.getAddress("me")

    then: "dao should be invoked with given response"
    actualResponse == "USA"
}
Объявите ваше взаимодействие в when: блоке:
def "Test Success Senario"() {
    when: "call service "
    def actualResponse = service.getAddress("me")

    then: "dao should be invoked with given response"
    1 * dao.getAddressFromSomewhere("me") >> "USA"
    actualResponse == "USA"
}
...