2011-09-15 24 views
0

UnitilsJUnit4とEasyMockでコード内のメール機能をテストしています。EasyMockで単体テストを実行中に予期しないメソッド呼び出しが発生しました

私のコードは次のようである..私は方法prepareをテストしていたときに

public void prepare(MimeMessage mimeMessage) { 
// some code .. 
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true); 
// some mail settings .. 

} 

、それは以下の例外を与えている..しかし、それは以下の表示されているメソッドは、Springフレームワークのクラスからです。

java.lang.AssertionError: 
    Unexpected method call setContent([email protected]): 
    setContent([email protected]): expected: 1, actual: 0 
    at $javax.mail.internet.MimeMessage$$EnhancerByCGLIB$$614de43f.setContent(<generated>) 
    at org.springframework.mail.javamail.MimeMessageHelper.createMimeMultiparts(MimeMessageHelper.java:344) 
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:290) 
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:247) 
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:226) 

私の方法をテストするにはどうすればよいですか?

答えて

1

あなたは間違ったことを嘲笑しているようです。 Springクラスを嘲笑する必要があるときにMail APIを嘲笑しているのは、それが直接的にやりとりすることだからです。あなたが今やっているやり方で、あなたは自分のものと一緒にSpringクラスを効果的にテストしています。これは本当にあなたが望むものではありません。

1

MimeMessageHelperをモックする必要があります。コンストラクタでmimeMessageを受け取るので、注入することはできません。だからこれを行うにはPowerMockのようなものが必要です。 documentationから

  1. テストケースの クラスレベルで@RunWith(PowerMockRunner.class)アノテーションを使用。
  2. の@PrepareForTest(ClassThatCreatesTheNewInstance.class) 注釈をテストケースのクラスレベルで使用します。
  3. 使用 PowerMock.createMock(NewInstanceClass.class)(のは mockObjectそれを呼びましょう)を構築しなければならないクラスのモックオブジェクト を作成します。
  4. 使用 PowerMock.expectNew(NewInstanceClass.class).andReturn(mockObject) のタイプ NewInstanceClass.classのオブジェクトの新規建設を期待するが、代わりにモックオブジェクトを返します。
  5. 使用PowerMock.replay(mockObject、NewInstanceClass.class)代わり PowerMock.replayAll()メソッドを使用して、モードを再生する モックオブジェクトおよびクラスを変更します。
  6. モックオブジェクトとクラスを ベリファイモードに変更するには、PowerMock.verify(mockObject、 NewInstanceClass.class)を使用するか、PowerMock.verifyAll()メソッドを使用します。明らかに

、私は本当にあなたがテストしようとしているのか分からないが、あなたのテストには、次のようになります。

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MessagePreparer.class) 
public class MessagePreparerTest { 

    @Test 
    public void testPrepare() { 
    MimeMessage mockMessage = PowerMock.createMock(MimeMessage.class); 
    MimeMessageHelper mockMessageHelper = PowerMock.createMock(MimeMessageHelper.class); 
    PowerMock.expectNew(MimeMessageHelper.class, 
         mockMessage, true).andReturn(mockMessageHelper); 
    // ...set other expectations 
    PowerMock.replay(mockMessage, mockMessageHelper, MimeMessageHelper.class); 
    MessagePreparer messagePreparer = new MessagePreparer(); 
    messagePreparer.prepare(mockMessage); 
    PowerMock.verify(mockMessage, mockMessageHelper, MimeMessageHelper.class); 
    } 
} 
2

私は、これは長い時間前に書かれた知っているが、私はちょうどこのまったく同じ問題に遭遇しました。

MimeMessageHelperを何らかの形でモックできれば、コードを簡単にテストできます。私はこれを、単にMimeMessageHelperクラスを返すインターフェイスを作成して、これをテストしていたクラスへの依存として追加しました。

インタフェース:

public interface MimeMessageHelperProvider { 
    MimeMessageHelper getMimeMessageHelper(MimeMessage mimeMessage); 
} 

を実装:

public class MimeMessageHelperProviderImpl implements MimeMessageHelperProvider { 
    @Override 
    public MimeMessageHelper getMimeMessageHelper(MimeMessage mimeMessage) { 
     return new MimeMessageHelper(mimeMessage); 
    } 
} 

今、あなたはMimeMessageHelperProviderに配線し、単にそれはあなたが反対を確認することができインスタンスを返すようにそのインターフェイスを模擬することができます。

関連する問題