Uri.parse()总是在单元测试中返回null

时间:2016-11-17 11:22:39

标签: android unit-testing uri

这个简单的单元测试总是通过,我无法弄清楚原因。

@RunWith(JUnit4.class)
class SampleTest {
    @Test testSomething() {
        Uri uri = Uri.parse("myapp://home/payments");
        assertTrue(uri == null);
    }
}

到目前为止,我所尝试的是使用"传统" URI(http://example.com)但uri也是null

4 个答案:

答案 0 :(得分:16)

我使用Robolectric解决了这个问题。

这些是我的单元测试配置

build.gradle

\\HKEY_CURRENT_USER\Software\Sparx Systems\EA400\EA\OPTIONS\FONTNAME
\\HKEY_CURRENT_USER\Software\Sparx Systems\EA400\EA\OPTIONS\FONTSIZE

测试类

dependencies {
...
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.4.2"
}

它适用于我,希望这可以帮助你。

答案 1 :(得分:11)

检查您应用的gradle文件中是否包含以下内容:

Uri

java.lang.RuntimeException: Method parse in android.net.Uri not mocked. See http://g.co/androidstudio/not-mocked for details. 是一个Android类,因此无法在本地单元测试中使用,如果没有上面的代码,您将获得以下代码:

null

上面的代码会抑制此异常,而是提供返回默认值的虚拟实现(在这种情况下为template<typename T> class Class { template<typename O> Class(O *o, std::true_type) {} template<typename O> Class(O *o, std::false_type) {} public: template<typename O> Class(O *o): Class(o, typename std::is_convertible<O*, T*>::type) {} }; )。

另一个选择是你在测试中使用了一些框架,它提供了Android类中方法的实现。

答案 2 :(得分:4)

Uri是Android类,因此在测试中使用之前需要进行模拟。

请参阅此答案,例如:https://stackoverflow.com/a/34152256/5199320

答案 3 :(得分:0)

最后,我只是将我的代码更改为接受URI String,所以现在它在生产和测试中都有效,并且省略Uri.parse()的使用。现在需要URI的地方我只使用uri.toString()而不是解析String