Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / August 2006

Tip: Looking for answers? Try searching our database.

How does one unit test a Mail Session?

Thread view: 
Danno - 11 Aug 2006 18:35 GMT
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.
AndrewMcDonagh - 11 Aug 2006 18:57 GMT
> 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);
 }

}
AndrewMcDonagh - 11 Aug 2006 19:00 GMT
>> 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.

snipped...

> class MyMailTest extends Testcase {
>
[quoted text clipped - 17 lines]
>
> }

I thought I'd show how we can inject the mock via the 'extract and over
ride' mechanism, a simpler way to do the same thing could be to pass the
mock as a Constructor arg.

And keep in mind, you only need to expose in the interface, those
methods that you actually  need today, you dont have to do all of them.

Regards

Andrew
Danno - 11 Aug 2006 19:01 GMT
> > 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.
[quoted text clipped - 70 lines]
>
> }

That's what I was leaning towards, and it's nice to know that that was
the good way to go.

Thanks so much.
Danno
AndrewMcDonagh - 11 Aug 2006 19:04 GMT
snipped...

> That's what I was leaning towards, and it's nice to know that that was
> the good way to go.
>
> Thanks so much.
> Danno

Cool.

oh one point worth keeping in mind, there's not many Junit users on this
NG, so if you do post a question and find no one has answered, do keep
in mind that there is a dedicated JUnit yahoo group available where they
are more than willing to help.

Andrew
Danno - 11 Aug 2006 19:07 GMT
> snipped...
>
[quoted text clipped - 12 lines]
>
> Andrew

Yep, I am a member of that as well.   I have a Velocity unit test q
too, and I will put that on the email list.


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.