0

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

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 方法?

我希望有人可以帮助我

4

2 回答 2

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 方法以确保值已更改。或者验证是否对您的模拟对象进行了预期调用。

于 2013-05-03T09:08:38.783 回答
0

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

@RunWith(MockitoJUnitRunner.class)
public class XMLHandlerTest {

    @InjectMocks
    XMLHandler handler = new XMLHandler();

    @Mock
    XMLConfiguration config;

    //...
于 2013-05-03T09:18:19.500 回答