我正在使用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....
}
但我不确定这是最佳做法。
答案 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/