繁体   English   中英

Micronaut controller 测试 - DefaultHttpClient (RxHttpClient) 在使用交换而不是检索时返回 null 正文

[英]Micronaut controller test - DefaultHttpClient (RxHttpClient) returns null body when using exchange instead of retrive

这是使用 Micronaut 2.3.1生成的示例应用程序。 我有一个简单的 controller 和一个 POJO:

@Controller
public class MyController {
    @Get("/hello")
    public HttpResponse<Response> getResponse() {
        return HttpResponse.ok(new Response("Hello"));
    }
}

public class Response {
    private String value;

    private Response() {
    }

    public Response(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

Spock中的测试套件。 问题是当使用RxHttpClient::exchange方法时 - 返回的主体总是null 但是,当使用RxHttpClient::retrive时,正文会正确返回:

@MicronautTest
class MyControllerTest extends Specification {

    @Inject
    @Client("/")
    RxHttpClient rxHttpClient;

    def "test exchange"() {
        given:

        when:
        HttpResponse<Response> response = rxHttpClient.toBlocking()
                .exchange(HttpRequest.create(HttpMethod.GET, "/hello"))
        then:
        response.status() == HttpStatus.OK
        response.body() != null //fails - body is null
    }

    def "test retrive"() {
        given:

        when:
        Response response = rxHttpClient.toBlocking()
                .retrieve(HttpRequest.create(HttpMethod.GET, "/hello"), Response.class)
        then:
        response != null
        response.value == "Hello"
    }
}

为什么exchange方法返回的HttpResponse的 body 是 null? 我想使用它,因为我还想对HttpResponse的其他属性做出断言。

这将起作用:

import io.micronaut.http.HttpResponse
import io.micronaut.http.HttpStatus
import io.micronaut.http.client.RxHttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import spock.lang.Specification

import javax.inject.Inject

@MicronautTest
class MyControllerSpec extends Specification {

    @Inject
    @Client("/")
    RxHttpClient rxHttpClient;

    void "test exchange"() {
        given:
        HttpResponse response = rxHttpClient.toBlocking().exchange("/hello", Map)
        Map body = response.body()

        expect:
        response.status == HttpStatus.OK
        body.value == 'Hello'
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM