2010-05-21 63 views
1

我想单元测试一个做SAX解析并创建一个对象的类。 该类将一个字符串作为表示Internet上文档URL的参数,对其进行解析,然后根据内容创建一个对象。如何重构我的课程,以便我可以进行单元测试?

我不想让单元测试实际访问网络,所以我想要解析一些测试xml文件。不过,我不知道如何从我的AndroidTestCases访问它们。我不想将测试文件包含在实际应用程序中,我希望他们在测试项目中(这是一个单独的项目,因为我可以收集Android测试的标准 - 由于需要定制AndroidManifest .xml,一个)。

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

我应该如何设计我的班级和/或测试来规避此问题?

回答

0

你会想要依赖注入。根据我读,你有一个方法签名像这样:

string -> object // using lambda notation 

这听起来像你有获得URL的内容存在于您所呼叫的同一方法的代码。你应该把它重构成一个单独的对象。然后,您可以制作一个模拟对象来进行测试,而不是进行网络访问,而是使用任何必要的参数对您的磁盘执行文件操作。在您的测试环境中,您可以在您的测试设置中注入模拟对象来代替真实的网络吸气剂对象。

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

+0

该方法和使我的类接受InputStream而不是字符串有什么区别?这不仅仅是增加额外的间接水平? – JRL 2010-05-21 14:34:12

+0

是的。这种额外的抽象层次意味着您可以在不影响主要方法的情况下更改底层代码。然后,您不必在正常情况下将InputStream传递到方法中,因为这通常不是您需要完成的任务。 – Tejs 2010-05-21 14:45:33

相关问题