如何通过MockMvc使用构造函数注入来测试控制器

发布于 2021-01-29 20:34:06

我有一个带有构造函数注入的控制器

@RestController
@RequestMapping("/user")
public class MainController {

    private final UserMapper userMapper; // autowired by constructor below

    public MainController(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @RequestMapping("/getChannels")
    public String index() {
        LoginUser user = userMapper.getUserByName("admin");
        return "Channels: " + user.getChannels();
    }
}

这是一个简单的类,可以正常工作。但是,当我尝试使用下面的类运行JUnit测试时,出现错误。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class MainControllerTest {

    private MockMvc mvc;
    private final UserMapper userMapper;

    public MainControllerTest(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new MainController(userMapper)).build();
    }

    ......

错误是:

java.lang.Exception: Test class should have exactly one public zero-argument constructor

上面的错误消息使我感到困惑,我该如何使用零参数构造函数注入userMapper?我知道可以在MainController中为userMapper添加@Autowired,但是不建议使用字段注入。请有人指导我一种用于构造函数注入和MockMvc测试的合适方法。谢谢。

关注者
0
被浏览
85
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    其他答案谈论使用注释,但是这里您的问题与使用注释没有任何关系。请记住,从Spring
    4.3开始,您不需要为依赖项注释构造函数,请参见此处

    实际上,您无需尝试在Test类(MainControllerTest)中模拟构造函数注入。您所需UserMapper要做的就是在应用程序上下文中声明为spring组件,并在测试类中将其作为运行中的应用程序自动注入到控制器中。

    您的错误是什么意思:错误消息中指出的所有Junit Test类 都应该恰好具有一个公共零参数构造函数 ,这是因为在您的情况下,Junit
    Test套件不知道如何实例化Test类。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看