35

UnitTestの作成にEasyMock(バージョン2.4)とTestNGを使用しています。

次のシナリオがあり、クラス階層の定義方法を変更できません。

ClassAを拡張しているClassBをテストしています。

ClassBは次のようになります

public class ClassB extends ClassA  {

  public ClassB()
    {
        super("title");
    }

    @Override
    public String getDisplayName() 
    {
        return ClientMessages.getMessages("ClassB.title");
    }

}

ClassAコード

public abstract class ClassA {
    private String title;

    public ClassA(String title)
    {
        this.title = ClientMessages.getMessages(title);
    }

    public String getDisplayName()
    {
        return this.title;
    }
}

ClientMessagesクラスコード

public class ClientMessages {
    private static MessageResourse messageResourse;

    public ClientMessages(MessageResourse messageResourse) 
    {
        this.messageResourse = messageResourse;
    }
    public static String getMessages(String code) 
    {
        return messageResourse.getMessage(code);

    }
}

MessageResourseクラスコード

public class MessageResourse {
    public String getMessage(String code) 
    {
        return code;
    }
}

ClassBのテスト

import static org.easymock.classextension.EasyMock.createMock;

import org.easymock.classextension.EasyMock;
import org.testng.Assert;
import org.testng.annotations.Test;

public class ClassBTest
{
    private MessageResourse mockMessageResourse = createMock(MessageResourse.class);
    private ClassB classToTest;
    private ClientMessages clientMessages;


    @Test
    public void testGetDisplayName()
    {

    EasyMock.expect(mockMessageResourse.getMessage("ClassB.title")).andReturn("someTitle");

        clientMessages = new ClientMessages(mockMessageResourse);

        classToTest = new ClassB();

        Assert.assertEquals("someTitle" , classToTest.getDisplayName());
        EasyMock.replay(mockMessageResourse);
    }
}

このテストを実行すると、次の例外が発生します。

java.lang.IllegalStateException:先行するメソッド呼び出しの動作定義がありませんgetMessage( "title")

私が見つけたものをデバッグしている間、コンストラクターから呼び出されたため、モックメソッド呼び出し mockMessageResourse.getMessage( "ClassB.title")は考慮されません(ClassBオブジェクトの作成)。

この場合のテスト方法を教えてください。

ありがとう。

4

5 に答える 5

48

EasyMock.replay(mock)テスト対象のメソッドを呼び出す前に呼び出す必要があります。テスト対象のメソッドを呼び出した後、呼び出しEasyMock.verify(mock)てモックが呼び出されたことを確認できます。

次に、「タイトル」引数を使用して別の呼び出しを追加する必要がありexpectます。これは、2 回呼び出すためです。

コード:

EasyMock.expect(mockMessageResourse.getMessage("title")).andReturn("title");    
EasyMock.expect(mockMessageResourse.getMessage("ClassB.title")).andReturn("someTitle");
EasyMock.replay(mockMessageResourse);
clientMessages = new ClientMessages(mockMessageResourse);

classToTest = new ClassB();

Assert.assertEquals("someTitle" , classToTest.getDisplayName());
EasyMock.verify(mockMessageResourse);
于 2010-06-09T11:00:34.957 に答える
23

私の場合は、戻り値指定(andReturn(...))の省略が原因でした。 詳細については、 http://www.smcmaster.com/2011/04/easymock-issue-1-missing-behavior.htmlを参照してください。

于 2013-04-29T08:58:41.357 に答える