【问题标题】:How to test the inner classes by using EasyMock如何使用 EasyMock 测试内部类
【发布时间】:2011-09-22 06:27:29
【问题描述】:

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

【问题讨论】:

    标签: java unit-testing easymock


    【解决方案1】:

    有些东西不能用 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,它允许您模拟静态调用和构造函数调用,以防您不介意更改测试框架。

    希望对您有所帮助。 问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多