【问题标题】:Write Spock Tests for RestAPI without MockMvc在没有 MockMvc 的情况下为 Rest API 编写 Spock 测试
【发布时间】:2021-01-27 14:33:05
【问题描述】:

我需要为以下代码编写 Spock 测试,但我不知道如何在 Spock 测试中使用我的控制器(我以前从未编写过 spock 测试)。您能否给我一个映射器的快速示例,以便我了解测试的结构?

从控制器获取映射器:

      @GetMapping("/users/{id}")
    public ResponseEntity<Optional<UserResource>> getUserById(@PathVariable long id) {
        final Optional<User> userOptional = userService.findById(id);
        final Optional<UserResource> userResourceOptional = userOptional.map(userMapper::mapToResource);
        return ResponseEntity.ok(userResourceOptional);
    }

我的用户映射器:

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface UserMapper {

    @Mapping(target = "password", ignore = true)
    UserResource mapToResource(User user);
    UpdateResource mapToResourceUser(User user);
    User mapToUserDomain(UserResource userResource);
}

我的 Spock-Try:

    void 'get user return his profile'(){
        given:
        def result = userService.findById(1) >> Optional.of(jon)
        def response = jonJsonString.toString()
        when:
        controller.getUserById()
        then:
        response == result
    }

提前致谢

【问题讨论】:

  • 欢迎来到 SO。请学习如何通过MCVE 提问,然后将问题编辑为一个。例如,您的测试不是一个完整的类,只是一个悬在半空中的 sn-p,没有任何上下文:userServicejonJsonStringcontroller 在测试中是如何定义的? userService 是如何在应用程序类中定义/注入的?我们应该猜测吗?我认为这对你没有多大帮助。请提供一整套我们可以复制、编译和运行的示例类。非常感谢。 ??????

标签: spring groovy spock


【解决方案1】:

userService 只是一个 mock,jonJsonString 是一个带有数据的对象,Controller 是 userController。但我解决了这个问题。我忘了问正确的期望。所以对于追随者来说,这是一个 Spock 测试示例:

import spock.lang.*

class Specs extends Specification {

    UserController controller
    UserService userService
    HashService hashService
    UserMapper userMapper
    TokenService tokenService
    TokenMapper tokenMapper
    ObjectMapper mapper = new ObjectMapper()

    User john
    User wick
    String johnJsonString
    String wickJsonString

    void setup(){
        controller = new UserController(userService, hashService, userMapper, tokenService, tokenMapper)

        userService = Mock UserService
        hashService = Mock HashService
        tokenService = Mock TokenService

        userMapper = Mappers.getMapper(UserMapper.class)
        tokenMapper = Mappers.getMapper(TokenMapper.class)

        john = new User([id: 1, name: 'John', email: 'sth@mail.de'])
        wick = new User([id: 2, name: 'Wick', email: '123123@123123.de'])

        johnJsonString = mapper.writeValueAsString(john)
        wickJsonString = mapper.writeValueAsString(wick)
    }

    void 'get user return a list of users'(){
        setup:
        userService.findAll() >> [john, wick]

        when:
        def result = controller.getUsers();

        expect:
        result.statusCode.value() == 200
        result.body != null
        result.body.size() == 2
    }


    void 'get user returns his profile'() {
        setup:
        userService.findById(1) >> Optional.of(john)
        def response = Optional.of(john)
        expect:
        userService.findById(1) == response
    }

【讨论】:

  • 此信息应该在问题中,而不仅仅是在答案中。恭喜你解决了自己的问题。但是,我建议您删除该问题,因为如果答案中没有完整的代码,则无法回答,但是有了答案,就没有更多未解决的问题了。因此,这个问题在这里没有增加任何价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2010-12-08
相关资源
最近更新 更多