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

mic*_*alk 3 java micronaut

这是使用 Micronaut 生成的示例应用程序2.3.1。我有一个简单的控制器和一个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个测试套件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"
    }
}
Run Code Online (Sandbox Code Playgroud)

HttpResponse为什么方法返回的bodyexchange为null?我想使用它,因为我还想对 的其他属性进行断言HttpResponse

Jef*_*own 5

这将起作用:

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'
    }
}
Run Code Online (Sandbox Code Playgroud)