java - 如何使用 MockMvc 的构造函数注入(inject)测试 Controller

标签 java spring-junit

我有一个带有构造函数注入(inject)的 Controller

@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

我对上面的错误消息感到困惑,我怎么能用零参数构造函数注入(inject) userMapper? 我知道可以在 MainController 中为 userMapper 添加 @Autowired,但是不推荐使用字段注入(inject)。 请任何人指导我一个合适的方法来进行构造函数注入(inject)和 MockMvc 测试。谢谢。

最佳答案

其他答案谈论使用注释,但这里你的问题与使用注释没有任何关系。请记住,作为 spring 4.3+,您不需要为依赖项注释构造函数,see more here .

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

你的错误是什么意思:所有 Junit 测试类作为错误消息说应该有一个公共(public)零参数构造函数那是因为在像你的场景这样的情况下 Junit 测试套件不知道如何实例化测试类。

关于java - 如何使用 MockMvc 的构造函数注入(inject)测试 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884466/

相关文章:

java - 代码或 mysql 数据库中的某个地方出错。获取 java.sql.SQLIntegrityConstraintViolationException

java - 为什么我的项目中不能使用 @Before 注解? "Before cannot be resolved to a type"

junit - 为什么我在运行基于 spring 的camel junit 测试用例时收到 java.lang.NoSuchMethodError

java - 如何使用mockito为此 Controller 类编写单元测试用例

java - 如何在<form>的action属性中指定servlet?

java - 在不初始化 Spring 上下文的情况下使用 Spring 属性加载

java - 在 Mac OS 10.5.8 上设置 JAVA5_HOME 环境变量?

java - 新关键字和垃圾收集