2013-07-03 4 views
2

Без создания другого класса, который я могу вставить. Возможно ли издеваться над javax.mail.Transport, чтобы я мог провести пробное тестирование метода Transport.send() на Java EE7?Mocking javax.mail.Transport

ответ

3

Следующее решение Билла Шанона, поскольку у Дамстера нет действующего артефакта 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 (сообщение)

+0

Главное преимущество использования «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

1

Да. На пути - использовать Мокито. 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); 
    } 
} 
+1

К сожалению, это только в тесте, но если в классе реализации используется «Транспорт», то он не будет проверяться. –

+0

Внесите свой макет в класс, который его использует, прежде чем тестировать этот класс, который на самом деле является наиболее распространенным способом использования mocks. – Keith

0

Другой подход заключается в использовании поддельной SMTP-сервер, такую ​​как Dumbster. Тесты JUnit в рабочей области источника JavaMail используют аналогичный подход.

0

Вы можете попробовать JavaMail Mock2 https://github.com/salyh/javamail-mock2

В основном это касается IMAP/POP3, но SMTP Mock также доступен. В вашем случае режим «Fullmock» - хороший выбор. Его также доступно в центральной части города.

0

Если вы на Linux/OSX вы можете использовать Python для создания макета сервера SMTP, так:

питон -m smtpd -n -c DebuggingServer локальный: 1025

Тогда достаточно, если вы подключаетесь к порту 1025 на localhost, и вы можете отправлять электронные письма. Код Python можно запустить простым вызовом ProcessBuilder (How to run Unix shell script from Java code?).

2

Если то, что вы хотите, чтобы 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

0

Другой подход, который не обсуждался в завернуть вызывает сообщение Transport.send (сообщение) в классе, который делегирует вызов. Это немного накладные расходы на базе кода, но это позволяет вам высмеивать ваш делегирующий класс и создавать нужные вам результаты.

public class TransportDelegator { 
    public void send(Message msg) throws MessagingException { 
     Transport.send(msg) 
    } 
} 

Затем извините TransportDelegator, как и в любых рамках, которые вы используете.