java.lang.IllegalStateException:前面的方法调用getMessage(" title")缺少行为定义 [英] java.lang.IllegalStateException: missing behavior definition for the preceding method call getMessage("title")

查看:456
本文介绍了java.lang.IllegalStateException:前面的方法调用getMessage(" title")缺少行为定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using EasyMock(version 2.4) and TestNG for writing UnitTest.

我有以下场景,我无法改变定义类层次结构的方式。

I have a following scenario and I cannot change the way class hierarchy is defined.

我正在测试扩展ClassA的ClassB。

I'm testing ClassB which is extending ClassA.

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

当我运行此测试时,我是获得以下异常:

When I'm running this this test I'm getting following exception:

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

java.lang.IllegalStateException: missing behavior definition for the preceding method call getMessage("title")

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

While debugging what I found is, it's not considering the mock method call mockMessageResourse.getMessage("ClassB.title") as it has been called from the construtor (ClassB object creation).

任何人都可以帮助我如何在这里测试case。

Can any one please help me how to test in this case.

谢谢。

推荐答案

你需要致电 EasyMock.replay(mock)在调用测试方法之前。调用测试方法后,您可以调用 EasyMock.verify(mock)来验证模拟是否被调用。

You need to call EasyMock.replay(mock) before calling the method under test. After calling the method under test you can call EasyMock.verify(mock) to verify the mock is called.

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

Next you need to add another expect call with the "title" argument since you call it twice.

代码:

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

这篇关于java.lang.IllegalStateException:前面的方法调用getMessage(" title")缺少行为定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆