1

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

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

我脑海中唯一的想法是伪造回复,例如:

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

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

4

1 回答 1

1

首先让你自己的断言类:

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();
      }
 }

}

和测试:

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);
    }
}

和服务等级:

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

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

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

断言类代码取自这里:https ://gist.github.com/AdelinGhanaem/4072405/

于 2015-06-30T13:55:57.053 回答