2017-08-13 16 views
1

2つの場所の距離を計算しようとしていますが、location.distanceToメソッドとLocation.distanceBetweenメソッドの両方を試しましたが、どちらの場合も0が返されます。間違っている。Android APIを呼び出すとユニットテストで常に0が返される

public static double distance(double lat1, double lon1, double lat2, double lon2, DistanceUnit unit) { 
    Location location1 = new Location(""); 
    location1.setLatitude(lat1); 
    location1.setLongitude(lon1); 
    Location location2 = new Location(""); 
    location2.setLatitude(lat2); 
    location2.setLongitude(lon2); 
    // Distance in km 
    double dist = location1.distanceTo(location2)/1000; 

    if (unit == DistanceUnit.Miles) { 
     // Distance in miles 
     dist = dist/1.6; 
    } 
    return dist; 
} 

私はテストの実行があることを確認するために実行していますユニットテスト:

@Test 
public void testDistance() { 
    double lat1 = 40.2582279; 
    double lon1 = -75.2654062; 

    double lat2 = 40.476492; 
    double lon2 = -75.355655; 

    double distance = LocationUtils.distance(lat1, lon1, lat2, lon2, DistanceUnit.Kilometer); 

    Assert.assertEquals(20, distance, 2); 

} 

そして、私は取得しています結果は次のとおりです。事前に

java.lang.AssertionError: 
Expected :20.0 
Actual :0.0 

おかげでここに私の方法であり、

答えて

1

携帯電話/エミュレータで実行しているアプリでLocationUtils.distance()メソッドを使用してみましたか?私はそれがあなたがその状況で期待するように動作すると思います。

ユニットテストを実行すると、Androidデバイスではなくコンピュータ上で実行されています。組み込みのAndroidクラス(Locationなど)は使用できません。 the docsから:

デフォルトでは、GradleのためのAndroidのプラグインは、任意の実際のコードが含まれていないandroid.jarライブラリの修正版と照らし合わせて地元のユニットテストを実行します。代わりに、ユニットテストからAndroidクラスへのメソッド呼び出しが例外をスローします。これは、あなたのコードだけをテストし、(明示的に嘲笑していない)Androidプラットフォームの特定の動作に依存しないようにするためです。

あなたは、この例外が発生しましたようにそれはあなたが、あなたがあなたのbuild.gradleファイルに

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

を追加することができることを言ったthisを読みました。この

java.lang.RuntimeException: Method setLatitude in android.location.Location not mocked. See http://g.co/androidstudio/not-mocked for details. 
    at android.location.Location.setLatitude(Location.java) 
    at example.com.stackoverflow.LocationUtils.distance(LocationUtils.java:13) 

のように見えてきたと思われる、見えます?これは、あなたがそれらを使用しようとすると例外を投げるからアンドロイドのクラスを防ぐが、何これが行うことの方法が代わりにヌルまたはゼロ

のいずれかを返すように、これは変更動作を

にあることに注意しませんあなたが見ている正確な動作:この特定のユニットテストは不要と思われる、より一般的には0


を返しlocation1.distanceTo(location2)。独自のロジックをテストするのではなく、主にAndroid APIをテストしています。 の部分がない限り、コードをテストしてもよろしいですか?あなたは正しい緯度/経度を一緒に保つことができますか?ユニット変換が期待通りに機能することはありますか?おそらく、あなたはあなたが心配している部分とそれをテストするためのロジックを抽出することができます。

+0

それは、私は異なった条件と距離に基づいてリストをソートしようとしていたのですが、その1つは距離であり、私はコンパレータをユニットテストしようとしていました。詳細な返信をありがとう。 – Vibhu

関連する問題