【问题标题】:Mocking objects with Spock用 Spock 模拟对象
【发布时间】:2021-09-17 10:25:44
【问题描述】:

我正在学习 Spock 框架。我无法对我的项目进行一些测试。

我将测试写入 REST API 保存方法:

@Override
public User save(User user) {
    roleRepository.findByName("ROLE_USER").ifPresent(role -> 
user.setRoles(Collections.singletonList(role)));
    user.setPassword(passwordEncoder.encode(user.getPassword()));
    return userRepository.save(user);
}

我的测试类看起来像这样:

class UserServiceImplSpec extends Specification {

 def userService
 def userRepository = Mock(UserRepository)
 def passwordEncoder = Mock(PasswordEncoder)
 def roleRepository = Mock(RoleRepository)

 def setup() {
    userService = new UserServiceImpl(userRepository, passwordEncoder, roleRepository)
}    


def 'should save user'() {
    given:
    def user = new User()

    when:
    userService.save(user)

    then:
    1 * roleRepository.findByName('ROLE_USER')
    1 * passwordEncoder.encode(user.getPassword())
    1 * userRepository.save(user)
    0 * _
}
}

运行测试后出现错误:

java.lang.NullPointerException
at com.jakub.shop.service.impl.UserServiceImpl.save(UserServiceImpl.java:28)
at com.jakub.shop.service.impl.UserServiceImplSpec.should save user(UserServiceImplSpec.groovy:47)

我知道我必须在我的 roleRepository 中模拟一些东西,但我不知道是什么。 适当的角色列表。我尝试了很多方法,但没有奏效。我应该怎么做才能正确编写此测试?我知道我的 rest 方法写得很好。

【问题讨论】:

  • 这一行有什么? UserServiceImpl.java:28

标签: java unit-testing spock


【解决方案1】:

您的findByNameencode 呼叫没有返回任何内容。您应该返回适​​当的值并检查它们是否被正确使用,如下所示:

def 'should save user'() {
    given:
    def user = new User()
    final String encodedPassword = 'pAsSwOrD'
    User saved

    when:
    userService.save(user)

    then:
    1 * roleRepository.findByName('ROLE_USER') >> Optional.empty()
    1 * passwordEncoder.encode(user.password) >> encodedPassword
    1 * userRepository.save(_) >> { saved = it[0] }
    0 * _

    and:
    encodedPassword == saved.password
    saved.roles.empty
}

另请注意,您不需要setup 方法;你可以说

@Subject
UserServiceImpl userService = new UserServiceImpl(userRepository, passwordEncoder, roleRepository)

更好的是,您可能想查看数据驱动测试的文档并拥有多个这样的测试用例:

where:
userRole || expected
null     || emptyList()
ROLE_OBJ || [ROLE_OBJ]

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2022-06-11
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多