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

Spring 在没有MockMvc的情况下为RestAPI编写Spock测试,spring,groovy,spock,Spring,Groovy,Spock,我需要为以下代码编写Spock测试,但我不知道如何在Spock测试中使用我的控制器(我以前从未编写过Spock测试)。你能给我一个简单的例子,让我了解测试的结构吗 从控制器获取映射程序: @GetMapping("/users/{id}") public ResponseEntity<Optional<UserResource>> getUserById(@PathVariable long id) { final

我需要为以下代码编写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);
    }
我的斯波克尝试:

    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
    }

提前感谢

userService只是一个mock,jonJsonString是一个带有数据的对象,Controller是userController。但是我解决了这个问题。我忘了问正确的期望。因此,对于以下人员,这是一个样本斯波克测试:

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
    }

欢迎来到SO。请学习如何通过提问方式提问,然后将问题编辑为一。例如,您的测试不是一个完整的类,只是挂在空中的一个片段,没有任何上下文:测试中如何定义
userService
jonJsonString
controller
?如何在应用程序类中定义/注入
userService
?我们应该猜猜吗?我认为那对你没有多大帮助。请提供一套完整的示例类,我们可以复制、编译和运行。非常感谢你。这些信息应该在问题中,而不仅仅是在答案中。恭喜你解决了自己的问题。但是,我建议你删除这个问题,因为如果没有答案中的完整代码,这个问题是不可回答的,但是有了答案,就没有其他问题了。因此,这个问题在这里没有任何价值。
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
    }