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

Dan*_*iel 5 java spring-junit

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

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个工作正常的简单类.但是,当我尝试使用下面的类运行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();
    }

    ......
Run Code Online (Sandbox Code Playgroud)

错误是:

java.lang.Exception: Test class should have exactly one public zero-argument constructor
Run Code Online (Sandbox Code Playgroud)

我被上面的错误消息搞糊涂了,我怎么能用一个零参数构造函数注入userMapper?我知道可以在MainController中为userMapper添加@Autowired,但不建议使用字段注入.请任何人指导我一个适合构造函数注入和MockMvc测试的方法.谢谢.

Ham*_*ani 1

其他答案谈论使用注释,但这里你的问题与使用注释没有任何关系。请记住,在 spring 4.3+ 中,您不需要为依赖项注释构造函数,请在此处查看更多信息

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

您的错误意味着什么:错误消息显示的所有 Junit Test 类都应该具有一个公共零参数构造函数,这是因为在您的场景中,Junit Test 套件不知道如何实例化 Test 类。