在Spock上调用服务会得到null对象



我试图在具有以下结构的spock框架下执行测试

class UserServiceSpec extends Specification{
ModelMapper modelMapper = Stub(ModelMapper.class)
UserRepository userRepository=Mock(UserRepository.class)
UserService userService
def setup(){
userService= new UserServiceImpl(userRepository,modelMapper)
}
def "find user by email"(){
given: "Creates a constant with an existing email"
def constant ="juan@rodriguez.com"
when: "Calling the method findUserByEmail"
def response= userService.findUserByEmail(constant)
then:"Comparing the response result with the constant"

response.getEmail()==constant
}
}

然而,当我尝试获取response.getEmail((的值时,结果是一个null对象,它应该获得与"相同的参数;常数";,错误是:

Cannot invoke method getEmail() on null object

UserService的代码结构和实现是:

public interface UserService {
UserModel findUserByEmail(String email);
}

UserService的实现是:

@Service
@Qualifier("userDetailsService")
public class UserServiceImpl implements UserService, UserDetailsService {
private final UserRepository userRepository;
private final ModelMapper modelMapper;
public UserServiceImpl(UserRepository userRepository,ModelMapper modelMapper){
this.userRepository= userRepository;
this.modelMapper= modelMapper;
}
}

然而,如果我用相同的方法从控制器(spring项目(调用Service,我会得到一个带有其参数的对象。如何修复这个spock测试?

  • 我试过"自动连线";而不是初始化为UserServiceImpl,但它不起作用
  • 我试着不嘲笑映射器和存储库,但仍然得到了相同的null对象

您没有指定与mockUserRepository的任何交互,因此Spock从您对其进行的任何方法调用中返回null。假设您的存储库是一个普通的存储库,可以这样说:

then:
userRepository.findByEmail(constant) >> { c -> new UserEntity(email: c, ...) }
constant == response.email // expected value comes first, and you can use Groovy property syntax

最新更新