Spock存根未返回期望值

问题描述 投票:0回答:1

我正在尝试使用Spock存根在我的服务类中模拟数据库/存储库依赖性,但是存根返回意外值时遇到问题。我不明白为什么只有在不将参数传递给模拟方法时存根才起作用。

given: 'I have client data'
Client client = new Client("Foo", "[email protected]")

and: 'a client repository always returns the id'
clientRepository = Stub(ClientRepository)
ClientEntity ce = new ClientEntity("Foo", "[email protected]")
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", "[email protected]")

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;
    }
}

和Spock依赖项

 <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>

感谢您的帮助!

unit-testing groovy spock
1个回答
0
投票

如果您这样做

ClientEntity ce = new ClientEntity("Foo", "[email protected]")
clientRepository.create(ce) >> 1

并且未执行存根交互,这是因为方法参数未根据您的期望进行匹配。我的猜测是equals(..)ClientEntity方法无法按您期望的那样工作,并且给create(..)的参数不完全是ce,而是它的副本,不满足equals(..)。] >

解决方案:修复您的equals(..)方法。

© www.soinside.com 2019 - 2024. All rights reserved.