如何重构我的课程,以便对其进行单元测试?

时间:2010-05-21 13:34:17

标签: android unit-testing refactoring uri

我正在尝试对执行SAX解析并创建对象的类进行单元测试。 此类将一个字符串作为表示Internet上文档的URL的参数,对其进行解析,然后根据内容创建一个对象。

我不希望单元测试实际访问网络,所以我想要解析几个测试xml文件。但是,我无法弄清楚如何从我的AndroidTestCases访问它们。我不想将测试文件包含在实际的应用程序中,我希望它们在测试项目中(它是一个单独的项目,因为需要有自定义的AndroidManifest,因此我可以收集Android测试的标准) .xml,一个)。

一种方法是将XML文件放在测试项目的资产目录中,我可以使用getContext().getAssets().open(filename将它们读入测试用例中的InputStream,但我的类需要一个URL字符串。我宁愿不必为这个类而不是当前的URL字符串提供InputStream。我可以通过制作两个方法来测试解析,一个接受一个字符串,一个接受一个I​​nputstream,然后测试第二个,但是我怎样才能测试一个只接受一个字符串的方法呢?

我应该如何设计我的课程或测试以避免这个问题?

1 个答案:

答案 0 :(得分:0)

你想要使用依赖注入。根据我读到的内容,你有一个类似的方法签名:

 string -> object // using lambda notation

听起来,您获取URL内容的代码与您调用的方法相同。您应该将其重构为单独的对象。然后,您可以创建一个模拟对象来进行测试而不是进行网络访问,而是使用任何必要的参数对磁盘执行文件操作。在测试环境中,您可以在测试设置中注入模拟对象来代替真实的网络getter对象。

然后该方法不关心它具有什么对象,只要它返回一些要解析的文本,即XHTML或XML。