문제

This is the class I'm trying to test (it calculates the size of HTTP page):

import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.*;
public class Loader {
  private Client client;
  public Loader(Client c) {
    this.client = c;
  }
  public Integer getLength(URI uri) throws Exception {
    return c.resource(uri) // returns WebResource
      .accept(MediaType.APPLICATION_XML) // returns WebResource.Builder
      .get(String.class) // returns String
      .length();
  }
}

Of course it just an example, not a real-life solution. Now I'm trying to test this class:

public class LoaderTest {
  @Test public void shouldCalculateLength() throws Exception {
    String mockPage = "test page"; // length is 9
    Client mockedClient = /* ??? */;
    Loader mockedLoader = new Loader(mockedClient);
    assertEquals(
      mockPage.length(), 
      mockedLoader.getLength(new URI("http://example.com"))
    );
  }
}

How should I mock com.sun.jersey.api.client.Client class? I'm trying to use Mockito, but any other framework will be OK, since I'm a newbie here..

도움이 되었습니까?

해결책

You example is really complex, i wasnt able to run it with newest version of jersey, so i created those classes and here is how i mock it with EasyMock.


String mockPage = "test page"; // length is 9

RequestBuilder requestBuilderMock = createNiceControl().createMock(RequestBuilder.class); expect(requestBuilderMock.get((Class < String >) anyObject())).andReturn("12345678").anyTimes(); replay(requestBuilderMock);

WebResource webResourcemock = createNiceControl().createMock(WebResource.class); expect(webResourcemock.accept((String[]) anyObject())).andReturn(requestBuilderMock).anyTimes(); replay(webResourcemock);

Client clientMock = createNiceControl().createMock(Client.class); expect(clientMock.resource((URI) anyObject())).andReturn(webResourcemock).anyTimes(); replay(clientMock);

Loader mockedLoader = new Loader(clientMock); assertEquals((Integer) mockPage.length(), mockedLoader.getLength(new URI("http://example.com")));

If any of classes that you are trying to mock doesnt have default constructor then you should use http://easymock.org/api/easymock/3.0/org/easymock/IMockBuilder.html#withConstructor%28java.lang.Class...%29

다른 팁

Not really related to your question, but may come in handy later, is the Jersey Test Framework. Check out these blog entries by one of the Jersey contributors;

http://blogs.oracle.com/naresh/entry/jersey_test_framework_makes_it

http://blogs.oracle.com/naresh/entry/jersey_test_framework_re_visited

Back on topic, to test your Loader class you can simply instantiate it with a Client obtained from Client.create(). If you are using Maven you can create a dummy test endpoint (in src/test/java) to call and the Jersey Test framework will load it in Jetty.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top