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了解更多详情.
| 归档时间: |
|
| 查看次数: |
63552 次 |
| 最近记录: |