我是单元测试和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方法?
我希望有人可以帮助我
答案 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;
//...