【问题标题】:How to refactor my class so I can unit test it?如何重构我的课程以便我可以对其进行单元测试?
【发布时间】:2010-05-21 13:34:17
【问题描述】:

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

我不想让单元测试真正访问网络,所以我想要一些测试 xml 文件来解析。但是我不知道如何从我的 AndroidTestCases 访问它们。我不想将测试文件包含在实际应用程序中,我希望它们在测试项目中(这是一个单独的项目,这是我可以收集到的 Android 测试的规范 - 因为需要有一个自定义的 AndroidManifest .xml,一个)。

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

我应该如何设计我的课程和/或测试来规避这个问题?

【问题讨论】:

    标签: android unit-testing refactoring uri


    【解决方案1】:

    您希望使用依赖注入。根据我阅读的内容,您的方法签名如下:

     string -> object // using lambda notation
    

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

    然后该方法不关心它拥有什么对象,只要它返回一些要解析的文本,无论是 XHTML 还是 XML。

    【讨论】:

    • 这种方法和让我的班级接受 InputStream 而不是字符串有什么区别?这不就是增加了一层额外的间接性吗?
    • 是的。这种额外的抽象级别意味着您可以在不影响您的主要方法的情况下更改底层代码。然后,您不必在正常情况下将 InputStream 传递给方法,因为这不是您正常完成任务所需的。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2010-09-22
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多