Re: How does one unit test a Mail Session?
Danno wrote:
How do you unit test a javax.mail.Session since Session is final and
does not implement any interface so that makes mocking a problem.
As with most 3rd party libraries, you can put it behind an adapter.
interface MySession {
void setProtocolForAddress(String addresstype, String protocol);
// copy the remaining or better still, used methods from Session
...
}
public class SessionAdapter implements MySession {
private Session theRealSession = Session.getInstance();
public void setProtocolForAddress(String addresstype, String protocol){
theRealSession.setProtocolForAddress(addressType, protocol);
}
// delegate remaining Session methods to 'theRealSession'
...
}
class MockSession implement MySession {
public String lastAddressType;
public String lastProtocol
public void setProtocolForAddress(String addresstype, String protocol){
lastAddressType = addressType;
lastProtocol = protocol;
}
}
class MyMail {
void send(String message) {
MySession session = createSession();
if (imap) {
session.setProtocolForAddress(addressType, "IMAP");
} else {
session.setProtocolForAddress(addressType, "SMTP");
}
}
/** Protected so test can over ride*/
protected MySession createSession() {
return new SessionAdapter();
}
}
class MyMailTest extends Testcase {
public void testImapTransportProtocolUsed() {
MockSession mockSession = new MockSession();
MyMail mailer = new MyMail() {
protected MySession createSession() {
return mockSession;
}
};
mailer.send("Boo");
assertEquals("Wrong transport protocol", "IMAP",
mockSession.lastProtocol);
}
}