How to test Reply<?> in sitebricks

113 views Asked by At

I am using sitebricks and I have to test Reply using jmock, but the object is not interface, so i cannot mock it. Here is some code:

@Get
Reply<Product> view() {
return Reply.with(new Product("Anti-ageing cure"))
          .as(Json.class);
}

The only thoughts in my minds are to fake Reply something like:

public class ReplyFake extends Reply{
 ....reply methods....
}

But i am not sure it is best practice.

1

There are 1 answers

0
panayot_kulchev_bg On

First make you own assertion class :

public class SitebricksReplyAssertion {

  public static <T> void assertIsRepliedWith(Reply<T> reply, T expected) {
      assertFieldValue("entity", reply, expected);
  }

  public static <T> void assertThatReplyStatusIs(Reply<T> reply, int expected) {
      assertFieldValue("status", reply, expected);
  }

  private static <T> void assertFieldValue(String fieldName, Reply reply, T expected) {
      Field field = null;
      try {
          field = reply.getClass().getDeclaredField(fieldName);
          field.setAccessible(true);
          T actual = (T) field.get(reply);
          assert actual != null;

          assertThat(actual, is(equalTo(expected)));
      } catch (NoSuchFieldException e) {
      e.printStackTrace();
      } catch (IllegalAccessException e) {
      e.printStackTrace();
      }
 }

}

and the test:

public class ServicesTest {

    @Rule
    public JUnitRuleMockery context = new JUnitRuleMockery();

    @Mock
    PendingUserRepository userRepository;

    @Test
    public void testName() throws Exception {

    Services services = new Services(userRepository);

    final List<PendingUserEntity> users = new ArrayList<PendingUserEntity>() {{
        add(new PendingUserEntity("email", "name", "url"));
        add(new PendingUserEntity("email2", "name2", "url2"));
    }};

    context.checking(new Expectations() {{
        oneOf(userRepository).retrieveAll();
        will(returnValue(users));
    }});

    final Reply<List<PendingUserEntity>> rep = services.getAll();

    SitebricksReplyAssertion.assertThatReplyStatusIs(rep, 200);
    SitebricksReplyAssertion.assertIsRepliedWith(rep,users);
    }
}

and the service class:

@At("/getpendingusers")
@Get
public Reply<List<PendingUserEntity>> getAll() {

List<PendingUserEntity> pendingUserEntities = pendingUserRepository.retrieveAll();

return Reply.with(pendingUserEntities).as(Json.class);
}

code of assertion class taken from here: https://gist.github.com/AdelinGhanaem/4072405/