java - 如何在 Junit 中使用 EasyMock 注解?
问题描述
我正在尝试使用 easyMock 注释来模拟方法。请在下面找到示例代码。
我面临的问题是在使用模拟注释时,我相信默认情况下该方法一直被模拟。但是我有两种不同的方法可以被嘲笑。一个在 try 块,另一个在 catch 块(当我不模拟学生方法时,它失败并进入 catch 块)。
但是由于 Student 方法一直被嘲笑,它没有进入 catch 块。因此没有涵盖教师方法。
谁能帮我理解我在这里缺少什么?Mock 注解和 createMock() 方法是如何工作的?两者的工作方式不同吗?
实际班级
@Autowire
Student std;
@Autowire
Teacher teach;
public void handleClass() {
try {
std.callMethodToGetName();
}
catch(Exception e) {
teach.informToTeacher();
}
}
测试类
@Mock
Student std;
@Mock
Teacher teach;
@TestSubject
ClassImpl testSub = new ClassImpl();
@Test
public void handleClassTestMethodStd() {
std.callMethodToGetName();
EasyMock.expectLastCall();
testSub.handleClass();
}
@Test
public void handleClassTestMethodTeach() {
teach.informToTeacher();
EasyMock.expectLastCall();
testSub.handleClass();
}
**Student Class**
Public void callMethodToGetName() {
String abc = "hiii hello biee";
}
解决方案
EasyMock 有 3 个阶段:记录、回放、验证。开始时,您处于录制阶段。你在哪里为你的模拟设置一个行为。然后你进入重播阶段。使用模拟和测试的地方。最后,您验证以确保所有预期的调用都已完成。最后一个阶段不是强制性的,但很有用。在您的情况下,您正在调用 void 方法。所以确保他们被称为是有道理的。
在记录阶段,expectLastCall()
是可选的。任何 void 方法都将通过调用它来记录。
因此,您的用例的完整工作测试如下:
public class ClassImplTest extends EasyMockSupport {
@Rule
public EasyMockRule rule = new EasyMockRule(this);
@Mock
private Student std;
@Mock
private Teacher teach;
@TestSubject
private ClassImpl testSub = new ClassImpl();
@Test
public void handleClassTestMethodStd() {
std.callMethodToGetName();
// Put in replay mode
replayAll();
testSub.handleClass();
// Make sure all expected calls where actually done
verifyAll();
}
@Test
public void handleClassTestMethodTeach() {
std.callMethodToGetName();
expectLastCall().andThrow(new Exception("test"));
teach.informToTeacher();
Exception actual = assertThrows(Exception.class, () -> testSub.handleClass());
assertEquals("test", actual.getMessage());
verifyAll();
}
}
请注意,我正在使用EasyMockSupport
使我的生活更轻松。但我们也可以调用EasyMock.replay(std, teach)
and EasyMock.verify(std, teach)
。
推荐阅读
- r - 闪亮服务器的问题,括号对我不满意
- python - python - 如何将csv行的第一项作为python中的列表名称?
- ruby - Ruby:nokogiri 需要 Ruby 版本 < 3.1.dev, >= 2.5
- python - python pd.read_excel [WinError 32] 该进程无法访问该文件,因为它正在被另一个进程使用
- javascript - 在返回节点之前等待嵌套循环完成
- php - 使用 PHPWord 更改布局、边框将 docx 转换为 PDF,
- python - Qt 动态属性 - 如果不是父级,则适用于小部件?
- postgresql - Postgres 订阅未启用
- html - 是否有必要将用户提交的数据转义到 HTML 输入值中?
- jackson - 如何忽略@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)