Как проверить внутренние классы с помощью EasyMock - PullRequest
1 голос
/ 22 сентября 2011

Я новичок в 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 Ответ

2 голосов
/ 25 сентября 2011

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

Надеюсь, это поможет. Привет.

...