2011-09-22 7 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); 
    } 


... 

} 

Испытание класса 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, что позволяет вам мешать статическим вызовам и вызовам конструктора, если вы не возражаете изменить свою тестовую структуру.

Надеюсь, это поможет. С уважением.

Смежные вопросы