如何通过MockMvc使用构造函数注入来测试控制器
我有一个带有构造函数注入的控制器
@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测试的合适方法。谢谢。
-
其他答案谈论使用注释,但是这里您的问题与使用注释没有任何关系。请记住,从Spring
4.3开始,您不需要为依赖项注释构造函数,请参见此处。实际上,您无需尝试在Test类(
MainControllerTest
)中模拟构造函数注入。您所需UserMapper
要做的就是在应用程序上下文中声明为spring组件,并在测试类中将其作为运行中的应用程序自动注入到控制器中。您的错误是什么意思:错误消息中指出的所有Junit Test类 都应该恰好具有一个公共零参数构造函数 ,这是因为在您的情况下,Junit
Test套件不知道如何实例化Test类。