如何在sitebricks

时间:2015-06-07 13:36:26

标签: java junit sitebricks

我正在使用sitebricks并且我必须使用jmock测试Reply,但是对象不是接口,所以我无法模拟它。这是一些代码:

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

我脑海中唯一的想法就是假装回复:

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

但我不确定这是最佳做法。

1 个答案:

答案 0 :(得分:1)

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/