2

以前に TDD をいくつかやったことがありますが、それらは単純明快でシンプルなものでした。

ただし、安らかなクライアントを実装し、サードパーティ (Twitter または Jira) の安らかな API を呼び出します。

それを実装するために、Resteasy クライアント フレームワークを使用しました。コードは次のとおりです。

public void invokePUT() {
     ClientRequest request =
                 new ClientRequest("http://example.com/customers");
     request.accept("application/xml");
     ClientResponse<Customer> response = request.put(Customer.class); 
     try {
          if (response.getStatus() != 201)
               throw new RuntimeException("Failed!");
     } finally {
          response.releaseConnection(); 
     }}

このメソッドのテストを書きたい場合 (このメソッドを実装する前にテストを書く必要があります)、どのようなコードを記述すればよいですか。

GET の場合、返されたエンティティが期待されるエンティティと等しいことをテストでき、POST の場合、作成されたエンティティの ID が null でないことをテストできます。

しかし、PUT と DELETE についてはどうでしょうか。ありがとう。

4

3 に答える 3

2

REST Assuredテスト フレームワークを使用してみてください。REST サービスをテストするための優れたツールです。彼らのウェブサイトには、それを使用する方法の例がたくさんあります。JUnit または TestNG と一緒に使用してアサーションをチェックするだけで完了です。

于 2012-05-08T21:38:49.243 に答える
1

短期的に問題に取り組む方法は次のとおりです。

1) リクエストをメソッドへのパラメーターに抽出します。invokePUT()今は次のようになります:

public void invokePUT(ClientRequest request) {
    request.accept("application/xml");
    ClientResponse<Customer> response = request.put(Customer.class); 
    try {
         if (response.getStatus() != 201)
              throw new RuntimeException("Failed!");
    } finally {
         response.releaseConnection(); 
    }
}

2) テストでは、スタブ化されたバージョンのClientRequest

@Test
public void sendsPayloadAsXml() {
    StubbedClientRequest request = new StubbedClientRequest(new StubbedResponse());
    restApi.invokePUT(request);
    assertEquals("application/xml", request.acceptHeader);
}

@Test
public void makesTheCallUsingPut() {
    StubbedClientRequest request = new StubbedClientRequest(new StubbedResponse());
    restApi.invokePUT(request);
    assertTrue(request.putWasCalled);
}

@Test
public void releasesTheConnectionWhenComplete() {
    StubbedResponse success = new StubbedResponse();
    StubbedClientRequest request = new StubbedClientRequest(success);
    restApi.invokePUT(request);
    assertTrue(success.connectionWasClosed);
}

@Test(expected = RuntimeException.class)
public void raisesAnExceptionWhenInvalidResponseReceived() {
    StubbedClientRequest request = new StubbedClientRequest(new StubbedResponse(400));
    restApi.invokePUT(request);
}

private static class StubbedClientRequest extends ClientRequest {
    public String acceptHeader = "";
    public boolean putWasCalled;
    public ClientResponse response

    public StubbedRequest(ClientResponse response) {
        this.response = response;
    }

    @Override
    public ClientResponse put(Class klass) {
        putWasCalled = true;
        return response;
    }

    @Override
    public void accept(String header) {
        acceptHeader += header;
    }

}

private static class StubbedResponse extends ClientResponse {
    public boolean connectionWasReleased;
    public int status = 201;

    public StubbedResponse(int status) {
        this.status = status;
    }

    public StubbedResponse() { }
}

これは完璧な設計ではないかもしれません (ClientRequest をクラスに渡し、RestEasy のものを外部に公開する) が、これは始まりです。

それが役立つことを願っています!

ブランドン

于 2012-05-09T12:37:12.643 に答える
1

put と delete が意図したとおりに呼び出された場合 (予想されるパラメーターなどを使用して)、テストする模擬クラスを挿入します。easymock などはそのために適しています (post と get と同じ)

編集: 残りのクライアントをテストする場合は、依存性注入を使用してリクエストを挿入し、次に easymock を使用して次のようにモックします (たとえば、delete が適切に呼び出されているかどうかをテストするため):

@Test void myTest(){
 ClientRequest mock = EasyMock.createMock(ClientRequest.class);
 mock.delete(2); //test if resource with id=2 is deleted or something similar

 EasyMock.replay(mock);
 invokeDelete(mock);
 EasyMock.verify(mock);
}
于 2012-05-08T14:04:07.340 に答える