Без создания другого класса, который я могу вставить. Возможно ли издеваться над javax.mail.Transport, чтобы я мог провести пробное тестирование метода Transport.send() на Java EE7?Mocking javax.mail.Transport
ответ
Следующее решение Билла Шанона, поскольку у Дамстера нет действующего артефакта Maven Central, я использовал GreenMail.
Тогда я использовал следующий код
final GreenMail mailServer = new GreenMail();
mailServer.start();
final Properties mailSessionProperties = new Properties();
mailSessionProperties.put("mail.smtp.port", String.valueOf(mailServer.getSmtp().getPort()));
final javax.mail.Session mailSession = javax.mail.Session.getInstance(mailSessionProperties);
testObject.setMailSession(mailSession);
Таким образом TestObject не нужно менять, даже если он имеет статический вызов Transport.send (сообщение)
Да. На пути - использовать Мокито. https://code.google.com/p/mockito/
public class CategoryDAOTest {
private Transport transport = Mockito.mock(Transport.class);
@Test
public void sendMessage() throws MessagingException {
transport.sendMessage(null, null);
}
}
Или с помощью аннотаций, чтобы создать макет:
@RunWith(MockitoJUnitRunner.class)
public class CategoryDAOTest {
@Mock
private Transport transport;
@Test
public void sendMessage() throws MessagingException {
transport.sendMessage(null, null);
}
}
К сожалению, это только в тесте, но если в классе реализации используется «Транспорт», то он не будет проверяться. –
Внесите свой макет в класс, который его использует, прежде чем тестировать этот класс, который на самом деле является наиболее распространенным способом использования mocks. – Keith
Другой подход заключается в использовании поддельной SMTP-сервер, такую как Dumbster. Тесты JUnit в рабочей области источника JavaMail используют аналогичный подход.
Вы можете попробовать JavaMail Mock2 https://github.com/salyh/javamail-mock2
В основном это касается IMAP/POP3, но SMTP Mock также доступен. В вашем случае режим «Fullmock» - хороший выбор. Его также доступно в центральной части города.
Если вы на Linux/OSX вы можете использовать Python для создания макета сервера SMTP, так:
питон -m smtpd -n -c DebuggingServer локальный: 1025
Тогда достаточно, если вы подключаетесь к порту 1025 на localhost, и вы можете отправлять электронные письма. Код Python можно запустить простым вызовом ProcessBuilder (How to run Unix shell script from Java code?).
Если то, что вы хотите, чтобы Transport.send не вызовов во время тестирования, то вы могли бы использовать это:
@RunWith(PowerMockRunner.class)
@PrepareForTest(javax.mail.Transport.class)
public class MyClassTest {
@Before
public void before() throws Exception {
suppress(method(Transport.class, "send", Message.class));
}
}
смотри также https://groups.google.com/forum/#!topic/powermock/r26PLsrcxyA
Другой подход, который не обсуждался в завернуть вызывает сообщение Transport.send (сообщение) в классе, который делегирует вызов. Это немного накладные расходы на базе кода, но это позволяет вам высмеивать ваш делегирующий класс и создавать нужные вам результаты.
public class TransportDelegator {
public void send(Message msg) throws MessagingException {
Transport.send(msg)
}
}
Затем извините TransportDelegator, как и в любых рамках, которые вы используете.
- 1. Mocking $ интервал
- 2. Лучше MOCKing?
- 3. Mocking Locale.forLanguageTag
- 4. Mocking Guid.NewGuid()
- 5. Mocking NSWindowController
- 6. Mocking itertools.zip_longest
- 7. Mocking Request.Url
- 8. Mocking String.valueOf()
- 9. Mocking RavenDb
- 10. Mocking мангуст
- 11. Mocking EntityManager
- 12. Mocking File.OpenWrite()
- 13. Mocking ApiController
- 14. Mocking HttpContext.Current.Application
- 15. Mocking HttpListenerContext
- 16. Mocking BigQueryIO
- 17. Mocking UserManager
- 18. Mocking DbEntityEntry
- 19. Mocking Communications
- 20. Mocking DbSet.toList
- 21. Mocking WebOperationContext
- 22. Mocking filesystem
- 23. Mocking FacesContext
- 24. Mocking Unmarshaller
- 25. Mocking Task.Delay
- 26. Mocking HttpContext.Current.ApplicationInstance.Response
- 27. MOQ - Mocking Response.Cookies.Clear()
- 28. Mocking mongoose using Sinon
- 29. Mocking the Eloquent Model
- 30. Продление/Mocking перечислений
Главное преимущество использования «GreenMail» заключается в том, что ваш тест затем может проверить, отправлено ли ожидаемое сообщение. Я добавил в свои тесты такие вещи, как: MimeMessage [] messages = mailServer.getReceivedMessages(); assertEquals (1, messages.length, «Не удалось получить регистрационное письмо»); assertEquals (1, сообщения [0] .getHeader («To»). length, «Malformed To headers in received registration email»); assertEquals (user.getEmail(), сообщения [0] .getHeader ("To") [0]); ' – Guss