在没有MockMvc的情况下为RestAPI编写Spock测试

时间:2020-10-13 09:06:23

标签: spring groovy spock

我需要为以下代码编写Spock测试,但是我不知道如何在Spock测试中使用我的Controller(我之前从未编写过Spock测试)。您能否给我一个有关我的Mappers的简单例子,以便我了解测试的结构?

从控制器获取GetMapper:

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

我的userMapper:

@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试用:

    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
    }

预先感谢

1 个答案:

答案 0 :(得分:0)

userService只是一个模拟,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
    }