2011-09-22 48 views
1

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

回答

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); 
    } 


... 

} 

的服務類類的測試將是這樣的:

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,它允許您嘲笑靜態調用和構造函數調用,以防您不介意更改測試框架。

希望它有幫助。 此致敬禮。