2011-09-22 12 views
1

EasyMockが初めてです。私はEasyMockを使ってクラスをテストする必要がありますが、問題はクラスに内部クラスがあり、この内部クラスが外部クラスのメソッドにinstatiatedされ、いくつかのパラメータを渡して内部クラスのメソッドを呼び出すことです。私はこのクラスをどのようにテストするのか分かりません。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 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 
    } 
} 

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


... 

} 

外部クラスのテスト、あなたは 離れてテストする必要はありません。 PrepareEmailNoticeに複雑なコードがあり、嘲笑されるべき場合は、 がMailWrapperのようなコンストラクタのパラメータとして渡すことができるMimeMessagePrepatorメンバを追加して変更を加えることができます。しかし、私はそれが複雑で、模倣される必要のあるコードを持っている場合には、おそらく内部クラスではないと考えています。

また、Powermockを使用すると、テストフレームワークを変更しても構わない場合でも、静的呼び出しとコンストラクタ呼び出しをモックできます。

希望します。よろしくです。 よろしくお願いします。

関連する問題