Как использовать реальные классы и мокито одновременно? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь запустить модульный тест с Mockito, но у меня есть вспомогательный метод, в котором я хочу использовать реальный класс:

public static Location fromCoordinates(float latitude, float longitude){
    Location result = new Location("");
    result.setLatitude(latitude);
    result.setLongitude(longitude);

    return result;
}

Приведенный выше метод в настоящее время вызывает «Метод ... не издевались «. ошибка, как описано здесь , она дает подсказку о том, как использовать значения по умолчанию, но это не будет работать для меня, так как это приводит к тому, что широта и долгота возвращают 0 впоследствии.

Я также попытался добавить Mockito.mock(Location.class, CALLS_REAL_METHODS); в начале моего теста, который, кажется, не имеет никакого эффекта.

Как я могу настроить свой тест, чтобы использовать реальный класс Location, все еще используя mockito для макета остальные?

[ Редактировать ] Для контекста, это рассматриваемый модульный тест

@Test
public void OpensCenteredInLocation() {

    Location l = Mockito.mock(Location.class, CALLS_REAL_METHODS);

    //When the user starts the app
    LocationManager m = Mockito.mock(LocationManager.class);
    Location initial = LocationHelper.fromCoordinates(10, 15); //<--it fails here
    doReturn(initial).when(m).getLastKnownLocation(any(String.class));
    MyApp main = new MyApp(m);

    //Then it should open with the map centered in the user's location
    Assert.assertEquals(10, main.CameraPosition.longitude, 0);
    Assert.assertEquals(15, main.CameraPosition.longitude, 0);
}

Когда он терпит неудачу, он выдает java.lang.RuntimeException: Method setLatitude in android.location.Location not mocked. See http://g.co/androidstudio/not-mocked for details.

1 Ответ

0 голосов
/ 06 марта 2020

Я думаю, что настоящая проблема не в том, что fromCoordinates метод является stati c, на мой взгляд, реальная проблема в том, что Location является встроенным Android классом.

На самом деле когда вы запускаете модульный тест, он запускается на вашем компьютере, а не на устройстве Android. Таким образом, вы не можете использовать встроенные Android классы.

Взгляните на android документацию

И затем в соответствии с этим do c сказал вам, что вы можете добавить в свой файл build.gradle

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

Это предотвращает выбросы исключениями классов android при попытке их использования, но учтите, что это на

Измените поведение, чтобы методы вместо этого возвращали либо ноль, либо ноль

...