Я попробовал оба подхода, чтобы узнать о преимуществах и недостатках:
Подход 1: создайте новый класс MockMessage, который реализует только те методы, которые мне нужны, в моем коде фильтра, а затем напишите стандартные тесты JUnit.
Проблема с отсутствующим абстрактным методом на самом деле тривиальна, так как эти методы могут быть сгенерированы используемой мной IDE (они будут пустыми, но в любом случае они не нужны тестируемому коду). Пакет Mock на самом деле не используется.
public class MockMessage extends Message {
private Date sentDate;
public MockMessage(Date sentDate) {
this.sentDate = sentDate;
}
public Date getSentDate() throws MessagingException {
return sentDate;
}
// the rest of the required methods can easily be generated by the IDE
...
}
public void testFilter1() {
try {
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
final Date date0 = dtf.parseDateTime("2011-05-19 05:51:26").toDate();
final Date date1 = dtf.parseDateTime("2011-05-19 05:51:27").toDate();
final Date date2 = dtf.parseDateTime("2011-05-19 05:51:28").toDate();
final List<Message> mockMessages = Arrays.asList(
(Message)new MockMessage(date0),
(Message)new MockMessage(date1),
(Message)new MockMessage(date2)
);
MessageFilter filter = new ByDate(date1, null);
List<Message> result = filter.doFilter(mockMessages);
assertEquals(result.size(),2);
assertEquals(result.get(0).getSentDate(),date1);
assertEquals(result.get(1).getSentDate(),date2);
}
catch(Exception e) {
fail(e.getMessage());
}
}
Подход 2: с использованием jMock и ClassImposteriser. Объем кода немного меньше, чем в подходе 1, и никакого дополнительного класса MockMessage не требуется.
Я все еще предпочитаю первый подход, так как его проще понять. Второй подход может быть полезен в других ситуациях, когда создание объектов гораздо сложнее, чем javax.mail.Message.
public void testFilter2() {
try {
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
final Date date0 = dtf.parseDateTime("2011-05-19 05:51:26").toDate();
final Date date1 = dtf.parseDateTime("2011-05-19 05:51:27").toDate();
final Date date2 = dtf.parseDateTime("2011-05-19 05:51:28").toDate();
Mockery mockery = new Mockery();
mockery.setImposteriser(ClassImposteriser.INSTANCE);
final List<Message> mockMessages = Arrays.asList(
mockery.mock(Message.class, "message 1"),
mockery.mock(Message.class, "message 2"),
mockery.mock(Message.class, "message 3")
);
mockery.checking(new Expectations() {{
allowing(mockMessages.get(0)).getSentDate(); will(returnValue(date0));
allowing(mockMessages.get(1)).getSentDate(); will(returnValue(date1));
allowing(mockMessages.get(2)).getSentDate(); will(returnValue(date2));
}});
MessageFilter filter = new ByDate(date1, null);
List<Message> result = filter.doFilter(mockMessages);
assertEquals(result.size(),2);
assertEquals(result.get(0).getSentDate(),date1);
assertEquals(result.get(1).getSentDate(),date2);
}
catch(Exception e) {
fail(e.getMessage());
}
}