【发布时间】:2020-03-04 06:52:03
【问题描述】:
我在 Spock 中的测试有问题:
@Subject
def mutation = new OrderedServicesMutation(long list of constructor elements here)
def "should order service and create address"() {
given:
def command = new OrderServiceCommand(1L, 2L, new Date(), "SomeAddress")
def user = new User(id: command.userId)
def address = new String()
def service = new Service(id: command.serviceId)
and:
userRepository.findById(command.userId) >> Optional.of(user)
serviceRepository.findById(command.serviceId) >> Optional.of(service)
when:
def result = mutation.orderService(command)
then:
with(result) {
user == user
address == address
service == service
}
}
OrderedServicesMutation.java:
@Component
@AllArgsConstructor
public class OrderedServicesMutation implements GraphQLMutationResolver {
// imports removed for readibility
@Transactional
@PreAuthorize("hasAnyAuthority('ACCOUNT_OWNER','USER')")
public OrderedService orderService(OrderServiceCommand command) {
OrderedService orderedService = orderedServiceRepository.save(
orderedServiceMapper.mapWithHistory(
userRepository.findById(command.getUserId()).orElseThrow(() -> new NotFoundException(User.class)),
command.getAddress(),
serviceRepository.findById(command.getServiceId()).orElseThrow(() -> new NotFoundException(Service.class)),
command.getDate()
)
);
orderedServicePublisher.publish(orderedService);
return orderedService;
}
该方法应该返回一个OrderedService类型的对象,它通常是在运行时,但是当我运行这个测试时,我得到:
Target of 'with' block must not be null
调试测试显示result 变量为空...
为什么 Spock 没有将 mutation.orderService(command) 的结果赋值给 result 变量?
【问题讨论】:
-
我认为你应该发布一个
orderService方法实现。没有代码,实际上很难说什么。 -
我已经添加了代码。
-
使用
user==user之类的东西看起来非常奇怪,我希望这始终是正确的 -
@dziki 什么是
orderedServiceMapper对象和mapWithHistory方法?我在你的测试中看不到它们。我还假设实现中的orderedServiceRepository是您的测试中的serviceRepository,对吗? -
好的,刚刚发现
serviceRepository不是orderedServiceRepository。通常,您的方法将返回与orderedServiceRepository.save相同的对象。似乎它没有被嘲笑所以它返回null。我说的对吗?
标签: java unit-testing groovy junit spock