java.lang.IllegalStateException:前面的方法调用getMessage("title")缺少行为定义

use*_*199 26 java testng unit-testing easymock

我正在使用EasyMock(版本2.4)和TestNG来编写UnitTest.

我有一个以下场景,我不能改变定义类层次结构的方式.

我正在测试扩展ClassA的ClassB.

ClassB看起来像这样

public class ClassB extends ClassA  {

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

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

}
Run Code Online (Sandbox Code Playgroud)

ClassA代码

public abstract class ClassA {
    private String title;

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

    public String getDisplayName()
    {
        return this.title;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

    }
}
Run Code Online (Sandbox Code Playgroud)

MessageResourse类代码

public class MessageResourse {
    public String getMessage(String code) 
    {
        return code;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时,我遇到以下异常:

java.lang.IllegalStateException:前面的方法调用getMessage("title")缺少行为定义

在调试我发现的内容时,它没有考虑模拟方法调用 mockMessageResourse.getMessage("ClassB.title"),因为它已经从construtor调用(ClassB对象创建).

任何人都可以帮我在这种情况下如何测试.

谢谢.

Jul*_*rop 41

您需要EasyMock.replay(mock)在调用测试方法之前调用.在调用测试方法之后,您可以调用EasyMock.verify(mock)以验证是否调用了mock.

接下来,您需要expect使用"title"参数添加另一个调用,因为您调用它两次.

码:

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);
Run Code Online (Sandbox Code Playgroud)


Red*_*eda 20

就我而言,它是由于遗漏了返回值规范(andReturn(...)). http://www.smcmaster.com/2011/04/easymock-issue-1-missing-behavior.html了解更多详情.

  • 同样在这里。检查方法是否返回某些内容,即使您不期望它(方法链接)似乎是个好主意。 (2认同)