5

内部でJerseyを使用してHTTPリクエストをRESTfulAPI(サードパーティ)に送信するJavaクラスを作成しています。

また、HTTP500応答を返すAPIをモックするJUnitテストを作成したいと思います。ジャージーに慣れていないので、これらのHTTP500応答をモックするために私がしなければならないことを理解するのは難しいです。

これまでのところ、これが私の最善の試みです。

// The main class-under-test
public class MyJerseyAdaptor {
    public void send() {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        String uri = UriBuilder.fromUri("http://example.com/whatever").build();
        WebResource service = client.resource(uri);

        // I *believe* this is where Jersey actually makes the API call...
        service.path("rest").path("somePath")
                .accept(MediaType.TEXT_HTML).get(String.class);
    }
}

@Test
public void sendThrowsOnHttp500() {
    // GIVEN
    MyJerseyAdaptor adaptor = new MyJerseyAdaptor();

    // WHEN
    try {
        adaptor.send();

        // THEN - we should never get here since we have mocked the server to
        // return an HTTP 500
        org.junit.Assert.fail();
    }
    catch(RuntimeException rte) {
        ;
    }
}

私はMockitoに精通していますが、ライブラリをモックすることには好みがありません。基本的に、誰かがHTTP 500応答をスローするためにモックする必要があるクラス/メソッドを教えてくれれば、実際にモックを実装する方法を理解できます。

4

3 に答える 3

4

これを試して:

WebResource service = client.resource(uri);

WebResource serviceSpy = Mockito.spy(service);

Mockito.doThrow(new RuntimeException("500!")).when(serviceSpy).get(Mockito.any(String.class));

serviceSpy.path("rest").path("somePath")
            .accept(MediaType.TEXT_HTML).get(String.class);

ジャージはわかりませんが、私の理解では、get()メソッドが呼び出されたときに実際の呼び出しが行われると思います。したがって、実際にhttp呼び出しを実行する代わりに、実際のWebResourceオブジェクトを使用し、get(String)メソッドの動作を置き換えて例外をスローすることができます。

于 2012-12-24T02:01:33.430 に答える
1

私はJerseyWebアプリケーションを作成しています...そしてHTTPエラー応答に対してWebApplicationExceptionをスローします。応答コードをコンストラクターパラメーターとして渡すだけです。例えば、

throw new WebApplicationException(500);

この例外がサーバー側でスローされると、ブラウザに500HTTP応答として表示されます。

これがあなたが望むものであるかどうかはわかりません...しかし、私は入力が役立つかもしれないと思いました!幸運を祈ります。

于 2012-12-24T01:54:34.003 に答える
0

次のコードで500応答をシミュレートできました。

@RunWith(MockitoJUnitRunner.class)
public class JerseyTest {

    @Mock
    private Client client;
    @Mock
    private WebResource resource;
    @Mock
    private WebResource.Builder resourceBuilder;

    @InjectMocks
    private Service service;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }


    @Test
    public void jerseyWith500() throws Exception {

        // Mock the client to return expected resource
        when(client.resource(anyString())).thenReturn(resource);
        // Mock the builder
        when(resource.accept(MediaType.APPLICATION_JSON)).thenReturn(resourceBuilder);

        // Mock the response object to throw an error that simulates a 500 response
        ClientResponse c = new ClientResponse(500, null, null, null);

        // The buffered response needs to be false or else we get an NPE
        // when it tries to read the null entity above.
        UniformInterfaceException uie = new UniformInterfaceException(c, false);
        when(resourceBuilder.get(String.class)).thenThrow(uie);

        try {
            service.get("/my/test/path");
        } catch (Exception e) {
            // Your assert logic for what should happen here.
        }
    }
}
于 2018-10-30T17:05:54.783 に答える