首页 > 解决方案 > 如何在 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";
}

标签: javaunit-testingeasymock

解决方案


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)


推荐阅读