我对发送JAX-RS POST调用的方法进行了JUnit测试。
为了独立于外部资源,我 mock 了REST客户端,并说应该返回一个虚拟响应。效果很好,没问题。但:

当调用myResponse.readEntity(String.class)时,我总是收到以下异常:



这是我的失败的代码段:

import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.Test;

public class SimpleTest {

    @Test
    public void testReadResponse() {
        final JsonObject responseContent = new JsonObject();
        responseContent.add("field", new JsonPrimitive("This is a JSON for testing."));
        final String expected = responseContent.toString();
        final Response.ResponseBuilder builder = Response.ok()
            .entity(responseContent.toString())
            .header("Content-Type", MediaType.APPLICATION_JSON);
        final Response dummyResponse = builder.build();
        final String result = dummyResponse.readEntity(String.class); // <-- Exception is thrown here!
        assertThat("JSON Strings are not identical.", result, is(expected));
    }
}

和Stacktrace:
   java.lang.IllegalStateException: RESTEASY003290: Entity is not backed by an input stream
    at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:230)
    at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:219)
    at de.me.myproject.SimpleTest.testReadResponse(SimpleTest.java:43)

在我的生产代码(调用未模拟的REST API)中,它返回一个自动生成的响应,其中.readEntity(String.class)方法可以正常工作。

最佳答案

Response 是一个抽象类,RESTEasy对于客户端和服务器具有不同的子类,请参见 BuiltResponse ClientResponse 。并非每个子类都支持所有方法。

Response#readEntity 需要由输入流支持:



输入流永远不会支持BuiltResponse,因此您会得到IllegalStateException

您可以使用 Response#getEntity ,它不需要输入流。

09-12 06:22