Спок заглушка не возвращает ожидаемое значение - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь использовать Spock Stub для макета зависимости базы данных / репозитория в моем классе обслуживания, но у меня проблема с заглушкой, возвращающей неожиданное значение. Я не понимаю, почему заглушка работает только тогда, когда я не передаю аргумент смоделированному методу.

given: 'I have client data'
Client client = new Client("Foo", "bar@baz.org")

and: 'a client repository always returns the id'
clientRepository = Stub(ClientRepository)
ClientEntity ce = new ClientEntity("Foo", "bar@baz.org")
clientRepository.create(ce) >> 1

when: 'I add the client'
ClientService clientService = new ClientServiceImpl(clientRepository)
Client addedClient = clientService.addClient(client)

then: 'The client object should be populated correctly'
addedClient.getId() == 1 // This fails b/c it's returning the id as 0

Но когда я использую аргумент _, тест проходит:

given: 'I have client data'
Client client = new Client("Foo", "bar@baz.org")

and: 'a client repository always returns the id'
clientRepository = Stub(ClientRepository)
clientRepository.create(_) >> 1

when: 'I add the client'
ClientService clientService = new ClientServiceImpl(clientRepository)
Client addedClient = clientService.addClient(client)

then: 'The client object should be populated correctly'
addedClient.getId() == 1 // This passes b/c it's returning the id as 1

Вот класс обслуживания

@Service
public class ClientServiceImpl implements ClientService{

    private ClientRepository clientRepository;

    @Autowired
    ClientServiceImpl(ClientRepository clientRepository){
        this.clientRepository = clientRepository;
    }

    @Override
    public Client addClient(Client client){

        ClientEntity clientEntity = new ClientEntity(
                client.getName(),
                client.getEmailAddress()
        );

        int id = clientRepository.create(clientEntity);
        client.setId(id);

        return client;
    }
}

И зависимость Спока

 <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>1.3-groovy-2.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-spring</artifactId>
            <version>1.3-groovy-2.5</version>
            <scope>test</scope>
        </dependency>

Спасибо за помощь!

1 Ответ

0 голосов
/ 30 марта 2020

Если вы сделаете это

ClientEntity ce = new ClientEntity("Foo", "bar@baz.org")
clientRepository.create(ce) >> 1

, а взаимодействие с заглушкой не будет выполнено, то, поскольку аргумент метода не соответствует вашему ожиданию. Я предполагаю, что equals(..) метод ClientEntity не работает так, как вы ожидаете, и что аргумент create(..) не совсем ce, а его копия, которая не удовлетворяет equals(..).

Решение: Исправьте метод equals(..).

...