如何使用EasyMock测试内部类

时间:2011-09-22 06:27:29

标签: java unit-testing easymock

我是EasyMock的新手。我需要使用EasyMock测试我的类,但问题是我的类有内部类,这个内部类在外部类的方法中实例化,并通过传递一些参数来调用内部类的方法。我不确定如何测试这门课程。

以下是一些示例代码。

Any help or suggetions are highly appreciated.

public class ServiceClass implements ServiceInterface {

   public void updateUSer(USer) {
      //some logic over here.
      sendEmailNotice(subject, vTemplate);
   }

   private sendEmailNotice(subject, vTemplate) {

       MimeMessagePrepator eNotice = new PrepareEmailNotice(subject, vTemplate);
       MailSender.send( eNotice );   
   }

   public class PrepareEmailNotice implements MimeMessagePrepator {
       // some local variables.
       public PrepareEmailNotice(subject, vTemplate) {
          subject = subject;
          vTemplate = vTemplate;
       }

       public void prepare( MimeMessage message) {
          MimeMessageHealper helper = new MimeMessageHealper(message, true);
          // setting the mail properties like subject, to address, etc..
        }
    }

1 个答案:

答案 0 :(得分:2)

有些东西你无法用Easymock作为对静态方法的调用和对构造函数的调用来模拟。您可能会更改您的代码以便能够使用Easymock进行测试,因为在方法sendEmailNotice中有一个您可能想要模拟的调用,但您不能。 MailSender.send()调用的模拟是合适的。我们可以创建一个包含可以模拟的MailSender调用的类。

public class MailWrapper {

  public MailWrapper () {
  }

  public void send ( MimeMessagePrepator eNotice) {
    MailSender.send(eNotice);
  }

}

您可以使用此类的实例在ServiceClass中使用。

public class ServiceClass implements ServiceInterface {

   //Added as a member  
   private MailWrapper mw;

   public ServiceClass () {
     this.mw = new MailWrapper();
   }

   //Constructor added for test purposes  
   public ServiceClass (MailWrapper mw) {
      this.mw = mw;
   }

   public void updateUSer(USer) {
      //some logic over here.
      sendEmailNotice(subject, vTemplate);
   }

   private sendEmailNotice(subject, vTemplate) {

       MimeMessagePrepator eNotice = new PrepareEmailNotice(subject, vTemplate);
       mw.send( prepator );   
   }


...

}

ServiceClass类的测试如下:

public class ServiceClassTest {

    @Test
    public void testUpdateUser() {

        String subject = "Expected subject";
        String vTemplate = "Expected vTemplate";

        MimeMessagePrepator eNotice = new PrepareEmailNotice(subject,vTemplate);       

        MailWrapper mwMock = createMock (MailWrapper.class);

        //expecting the void call to the MailWrapper
        mwMock.send(eNotice);
        //other expectations...

        replay(mwMock);
        ServiceClass sc = new ServiceClass(mwMock);
        sc.updateUser(new User());
        verify(mwMock);
        //some asserts
    }
}

在你询问内部类的消息中,但我认为内部类的测试包含在外部类的测试中,你会 不需要分开测试。如果PrepareEmailNotice具有复杂的代码并且应该被模拟,您可以进行更改,添加MimeMessagePrepator成员 可以作为MailWrapper之类的构造函数中的参数传递。但我认为,如果它有复杂且不得不被嘲笑的代码,也许它不会是一个内部类。

此外,您可以使用Powermock,它允许您模拟静态调用和构造函数调用,以防您不介意更改测试框架。

希望它有所帮助。 问候。