mockito test void方法,覆盖成员变量

时间:2013-05-03 08:27:59

标签: java junit mockito

我是单元测试和mockito的新手,但我需要测试这个类:

public class XMLHandler {
    private static final String CONFIG_FILE = "path/to/xml";
    private XMLConfiguration config = null;

    public XMLHandler() {
        try {
            config = new XMLConfiguration(CONFIG_FILE);
            config.setValidating(true);
        } catch (ConfigurationException e) {
            LOGGER.log(Level.SEVERE, e );
        }
    }

    public List<ConfigENtries> getEntries() {     
        // do some stuff
        return list;
    }

    @Override
    public void removeEntry(int index) {
        // remove entry
    }
}

我认为我必须用模型覆盖配置变量,但我没有设置器,所以我该怎么做? 那么removeEntry呢?如何测试void方法?

我希望有人可以帮助我

2 个答案:

答案 0 :(得分:1)

由于您被允许修改您的课程,我建议使用以下结构:

public class XMLHandler {
  private final XMLConfiguration config;

  public XMLHandler(XMLConfiguration config) {
    this.config = config;
  }

  public List<ConfigENtries> getEntries() {     
    // do some stuff
    return list;
  }

  @Override
  public void removeEntry(int index) {
    // remove entry
  }
}

确保XMLConfiguration接口,而不是具体的实现。然后,您可以模拟传递给构造函数的config参数。 (注意:您也可以模拟非最终的具体类,但首选使用接口。)

然后,您可以测试XMLHandler的公共方法,并通过检查对config的调用并断言方法响应是正确的来确认正确的行为。

可以毫无问题地测试无效方法。您只需要某种方法来确定对象和世界的状态已经过校正。因此,您可能需要在测试结束时调用getter方法以确保值已更改。或者验证对模拟对象的预期调用。

答案 1 :(得分:0)

虽然我也更喜欢修改构造函数并传递XMLConfiguration,如@DuncanJones建议(或使用其他类型的依赖注入),但您可以使用mockito通过使用XMLConfiguration注释来模拟@InjectMocks你的考试:

@RunWith(MockitoJUnitRunner.class)
public class XMLHandlerTest {

    @InjectMocks
    XMLHandler handler = new XMLHandler();

    @Mock
    XMLConfiguration config;

    //...