我正在使用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....
}
但我不确定这是最好的做法
首先创建自己的断言类:
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/