【问题标题】:How to mock public void method using jmockit?如何使用 jmockit 模拟公共 void 方法?
【发布时间】:2014-06-09 02:05:58
【问题描述】:

我正在尝试为我的 Spring MVC 控制器编写一些 junit 测试,到目前为止我能够成功地做到这一点。我也在使用 Spring Mock 和 jmockit。

下面是我在DataController控制器中的方法——

@RequestMapping(value = "processWork", method = RequestMethod.GET)
public @ResponseBody
DataResponse processWork(@RequestParam("conf") final String value, @RequestParam("dc") final String dc) {

    // .. some code here


    SomeOtherClass modifier = new SomeOtherClass(zookClient);
    List<Map<String, String>> mappings = getMappings(dc);
    modifier.processTask(value, mappings);      

    // .. some code here

}

现在在SomeOtherClassprocessTask方法是这样的——

public void processTask(String value, List<Map<String, String>> mappings) throws Exception {

    //  some code here

}

下面是我为DataController 类中的processWork 方法编写的junit 测试。

private MockMvc mockMvc;

@Test
public void test03_processWork() throws Exception {

    mockMvc.perform(
        get("/processWork").param("conf", "shsysysys").param("dc", "eux")).andDo(print()).andExpect(status().isOk());

}

问题陈述:-

现在的问题是,每当我运行test03_processWork 单元测试时,它会进入我的控制器的processWork 方法(这很好),然后它调用我的SomeOtherClassprocessTask 方法,然后是我想要避免的。

意思是,有什么办法,我可以模拟SomeOtherClassprocessTask 方法以返回一些默认值,而不是运行实际代码processTask 方法中有什么?

目前在我的 junit 测试运行中,它也在调用 SomeOtherClassprocessTask 方法,processTask 中的代码也在运行,这就是我想要避免的。我不希望 processTask 中的任何代码通过使用 jmockit 进行模拟来运行?

这可能吗?

【问题讨论】:

标签: java spring unit-testing junit jmockit


【解决方案1】:

您可以像这样使用JMockit 模拟您的public void 方法:

new MockUp<SomeOtherClass>() {
    @Mock
    public void processTask(String value, List<Map<String, String>> mappings) throws Exception {
        System.out.println("Hello World");
    }
};

只需在单元测试开始时将其添加到模拟上方即可。

【讨论】:

  • 给定一个具有 3 个方法的类,其中 1 个是 void 返回方法,我用期望模拟其他 2 个。我只看到 void 返回方法我不能使用 MockUp 因为两者都不能在 1 个测试用例中使用。实现这一目标的方法是什么?
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多