2016-11-17 19 views
6

この単純な単体テストは常に通過し、なぜその理由が分かりません。私は "伝統的な" URI(http://example.com)が、uriを使用しているこれまでに試してみましたが何Uri.parse()は単体テストで常にnullを返します

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

nullました。アプリのGradleのファイルに次のようにしている場合

答えて

4

チェック:

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)を返すダミーの実装を提供します。

もう1つの選択肢は、テストでAndroidクラスのメソッドの実装を提供するフレームワークを使用していることです。

+0

私はテストに合格したので、例外がスローされません。さらに、null以外のUriオブジェクトが必要なだけでなく、特定のプロパティ(スキーム、パスなど)を持つUriオブジェクトが必要です。 –

+0

これを追加しましたが、まだ動作しません。 – Allen

0

は最後に、私はちょうどので、今では生産や試験及びUri.parse()の使用を省略し、両方の作品、StringとしてURIを受け入れるように自分のコードを変更しました。ここでURIが必要な場所は、Stringを解析する代わりにuri.toString()を使用するだけです。

+1

これは良い考えではありません。 Uriを使用することで、文字列と比較してより高いレベルの型を安全に提供できます。文字列には何でも含めることができますが、少なくともUriであることをあなたは知っています。ユニットテストでは、コードの品質を向上させ、減少させることはありません。私はむしろ、このテストを接続された(エスプレッソ)テストに変えたいと思う。 – 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

関連する問題