Easymock 不保留方法的注释

问题描述

我试图模拟一个具有一些带有注释的公共方法的类(它实际上是一个 SpringBoot @RestController 类型的类)。

当我模拟它并使用 expect 来处理少数带有注释的方法时,我发现 Easymock 丢失了注释并且我的代码中断了。

是 EasyMock 的限制还是我需要做些什么才能让它工作?

编辑: 这是我试图模拟的课程片段:

@CrossOrigin
@RestController
@RequestMapping(path = "/users")
public class UsersController {

    @RequestMapping(
            path = "/getUsers",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_VALUE,produces = MediaType.APPLICATION_JSON_VALUE)
    public List<User> getUsers(@RequestBody UserRequest userRequest,HttpServletRequest request) {
...
}
...
}

模拟测试代码

@Test
    public void testGetUsers() throws Exception {
UserController controller = createMock(UserController.class);
        expect(controller.getUsers(userRequest,httpRequest)).andReturn(Collections.emptyList());
        
        replay(controller);
        
        ...
        
        verify(controller);
}

我做了一个简单的检查,我没有传递模拟实例,而是传递了一个实例化的实例,它运行良好!所以我的结论是,当模拟一个方法上有注释的类时,它会丢失注释。

顺便说一句,我使用的是easymock 3.4

编辑 2:

  • 我已升级到 v4.2,但没有帮助。

  • 重现它的方法很简单,就是运行这段代码

public void testGetUsers() throws Exception {

   UserController controller = createMock(UserController.class); 
 
 expect(controller.getUsers(userRequest,httpRequest)).andReturn(Collections.emptyList());
        
   replay(controller);

   Method[] methods = controller.getClass().getmethods();
   if(methods[0].isAnnotationPresent(RequestMapping.class) == false) {
   System.out.println("FOUND THE PROBLEM!!");
}

谢谢!

解决方法

模拟是一件简单的事情。它扩展了一个类并覆盖了所有方法。注释不会添加到生成的类中。因为你在嘲笑一种行为。模拟并不意味着传递给注释处理器。

没有什么可以阻止它,只是 20 年来没有人需要该功能。我很想知道您为什么需要它的完整示例。