当前位置: 首页 > 面试题库 >

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

公孙嘉禧
2023-03-14
问题内容

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

@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类。



 类似资料:
  • 嗨,我有一个问题。我想用espresso为Ui编写android测试,为了让测试不是乱七八糟的,我想嘲弄一下我的演示者。 我在应用程序里用匕首。我的配置如下: 我有组件的模块 那么我也有一个用于活动的组件和一个用于组件的模块 那么我的页面就有了子组件 和子组件的模块 然后详细信息activity注入DetailPresenter 然后是使用构造函数注入的presenter 现在在测试中,我要做的是

  • 问题内容: 我正在使用spring 3.2.0和junit 4 这是我需要测试的控制器方法 spring-servlet config is: This is my test class : 如何使用MockMvc测试此方法? 问题答案: 你可以使用以下注释来使用应用程序调度程序servlet xml。以下示例使用路径/ mysessiontest设置了一些会话属性并期望返回某个视图来命中控制器:

  • 我想在GWT项目中强制执行构造函数注入,使用Guice注释,它可以放在字段注入和构造函数注入的构造函数上。 该项目已经使用了检查风格和PMD。 我可以简单地通过禁止字段上的注释来强制构造函数注入,但是我找不到检查风格模块或PMD规则来做到这一点。我肯定我错过了一些东西,因为它似乎是静态代码分析工具的日常任务。

  • 在Symfony中,您可以直接将服务注入控制器函数: 我在寻找什么时候注射什么时候不注射的理由/指南。其中一种或赞成/反对的性能价格是多少,例如: 您必须始终以不使用为目标吗? 如果类中的所有方法都使用,我是否仍然在每个方法中加载它们,还是现在使用? 我如何决定我实现哪种解决方案? 我当前的逻辑是“尽可能多地使用动作注入,因为这样可以节省初始化所有控制器的时间,但缺点是方法调用会稍微慢一些,因为现

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 我有一个接口,它在两个地方定义如下: 我的客户端实现类没有任何注释,只有必需的构造函数。在这种情况下,如何限定正确的接口实现用法?我不想使用,因为在我的例子中,将其中一个用法命名为primary在语义上是不正确的(它们在某种意义上是相等的)。我需要用相同的实现类传递相同的接口,但针对受尊敬的客户机的特定用例进行了不同的配置。我想命名一个参数就足够了,通过这个参数我将实现注入到bean创建方法中,但