Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用EasyMock测试内部类_Java_Unit Testing_Easymock - Fatal编程技术网

Java 如何使用EasyMock测试内部类

Java 如何使用EasyMock测试内部类,java,unit-testing,easymock,Java,Unit Testing,Easymock,我是EasyMock的新手。我需要使用EasyMock测试我的类,但这里的问题是我的类有内部类,而这个内部类是在外部类的方法中建立的,并通过传递一些参数来调用内部类的方法。我不知道如何测试这门课 下面是一些示例代码 Any help or suggetions are highly appreciated. public class ServiceClass implements ServiceInterface { public void updateUSer(USer) {

我是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..
        }
    }

有些东西不能用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一样在构造函数中作为参数传递。但我认为,如果它很复杂,必须是模拟代码,那么它可能不是一个内部类

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

希望能有帮助。 问候