2016-11-17 215 views
6

这个简单的单元测试总是通过,我找不到原因。Uri.parse()在单元测试中总是返回null

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

我至今尝试过使用 “传统” URI(http://example.com),但urinull

回答

4

检查,如果你在你的应用程序的gradle这个文件中的以下内容:上面你会得到如下

android { 
    ... 
    testOptions { 
     unitTests.returnDefaultValues = true 
    } 

Uri是一个Android类,因此不能在本地单元测试使用,无需代码:

java.lang.RuntimeException: Method parse in android.net.Uri not mocked. See http://g.co/androidstudio/not-mocked for details. 

上面的代码取消了这个异常,而是提供返回默认值的虚拟实现(在这种情况下为null)。

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

+0

我在我的OP中表示测试通过,所以没有任何异常抛出。此外,我不仅需要一个非null的Uri对象,我需要一个具有特定属性的Uri对象(方案,路径等) –

+0

我已经添加了这个,但仍然无效 – Allen

0

最后我只是改变了我的代码,以接受URI作为String,所以现在它的作品无论是在生产,测试和省略的Uri.parse()使用。现在需要一个URI,我只需要使用uri.toString()而不是解析String

+1

我不认为这是个好主意。通过使用Uri,与字符串相比,您可以安全地提供更高级别的类型。字符串可以包含任何内容,至少你知道这是一个有效的Uri。你的单元测试应该会提高你的代码质量,而不是降低它。我宁愿将此测试变为连接(Espresso)测试。 – Michael

2

我用Robolectric解决了这个问题。

这些都是我的单元测试配置

的build.gradle

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

测试类

@RunWith(RobolectricTestRunner.class) 
public class TestClass { 

    @Test 
    public void testMethod() { 
     Uri uri = Uri.parse("anyString") 
     //then do what you want, just like normal coding 
    } 
} 

它为我工作,希望这可以帮助你。

+0

为什么这个-1?在我看来,这是实际正确的答案,因为Robolectric为您提供了Uri的实际实现,不仅仅是一个模拟,还有您需要单元测试Android的其他实现。 – Bradford2000