2016-12-21 5 views
1

У меня есть служба, которая использует другую услугу, которую я хочу издеваться.Смазочные услуги с весенним ботинком и Spock

@Service 
public class CustomerService { 

    @Autowired 
    private CustomerRepository customerRepository; 

    @Autowired 
    private PatientRepository patientRepository; 

    @Autowired 
    private MyHelper myHelper; 

    public Office createOfficeAccount(Office commonOffice) throws Exception { 

     // this line calls another service via http, I want to mock it: 
     Account newAccount = myHelper.createAccount(officeAccount); 
     return customerRepository.save(customer); 
} 

Вот мой тестовый класс:

class KillBillCustomerServiceTest extends BaseSpecification { 

    @Autowired 
    private CustomerService customerService = Mock(CustomerService) 

    @Autowired 
    private PatientRepository patientRepository = Mock(PatientRepository) 

    @Autowired 
    private MyHelper kbHelper = Mock(MyHelper) 

    def setup() { 
     customerService.setPatientRepository(patientRepository) 
     customerService.setMyHelper(kbHelper) 
    } 

    def "create new Account from Common Office"() { 

     def commonOffice = createOfficeForTests() 
     CustomerService customerService = new CustomerService (myHelper: kbHelper) 

     when: 
     kbHelper.createAccount(commonOffice) >> new Account() // want to mock it, but it is still calling the actual class to try and make the network call 
} 

Мой вопрос, как я дразнить мой класс MyHelper так, что он на самом деле не попытаться сделать реальный вызов, но вместо этого просто возвращает окурок объект?

+0

проверить его http://www.baeldung.com/injecting-mocks-in-spring – Dongqing

+0

, который для Mockito и я не Я не считаю его чем-то другим, чем то, что я делаю выше. – sonoerin

ответ

2

Я думаю, что вы не можете указывать ожидания в блоке when, и это является основной причиной здесь.

Проверить Spock interaction testing tutorial Он имеет раздел под названием «Где Объявляет взаимодействия», и в нем говорится, что вы можете объявить ожидания в «настройки» (при) или «затем» блокирует только

Вот упрощенный пример такое взаимодействие, которое работает на моей машине:

interface Account {} 

class SampleAccount implements Account {} 


interface DependentService { 
    Account createAccount(int someParam) 
} 

class DependentServiceImpl implements DependentService { 

    Account createAccount(int someParam) { 
     new SampleAccount() 
    } 
} 


class MyService { 

    private DependentService service 

    public MyService(DependentService dependentService) { 
     this.service = dependentService 
} 

public Account testMe(int someParam) { 
    service.createAccount(someParam) 
} 

}

Здесь вы можете увидеть некоторые услуги (MyService) для тестирования и это зависит от интерфейса DependantService (я работал с интерфейсом потому что у меня нет CGLIB в пути к классам моего проекта образца, это не имеет никакого значения для вашего вопроса)

А вот тест на Спока:

class SampleSpec extends Specification { 

def "check"() { 
    setup: 
    def mockDependentService = Mock(DependentService) 
    def mockAccount   = Mock(Account) 
    1 * mockDependentService.createAccount(5) >> mockAccount 
    MyService testedObject = new MyService(mockDependentService) 
    when: 
    def expectedAccount = testedObject.testMe(5) 
    then: 
    expectedAccount == mockAccount 
    } 
} 

Как вы видите, , у меня есть мои ожидания установлены в данном блоке здесь

Надеются, что это помогает

+0

Отличный ответ, который заставил меня перепрыгнуть через горб, чтобы теперь я мог издеваться над одним из классов @Autowired, чтобы вернуть объект для тестирования. Спасибо за большую помощь! – sonoerin