Тестирование Android создает методы только для тестирования - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать тест на активность с JUnit и эспрессо.

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

Я храню пользовательские данные в закрытой переменной (чтобы предотвратить нежелательные изменения), и единственный способ применить к ней значение - это использовать метод loadFromDatabase.

Но я не могу использовать этот метод во время тестирования, потому что у него есть прослушиватель обратного вызова (он отправляет запрос на сервер), и мне нужно загрузить эти данные немедленно, чтобы загрузить действие

public User {
    private static User mCurrentUser = ...;

    public static void loadFromDatabase() { ... }
}


public MainActivityTest {

   public MainActivityTest() {
       // load the data                   
       User.loadFromDatabase({
          // on complete callback
       })

       // load the activity
       activity = new ActivityTestRule(MainActivity.class)
   }

}

public MainActivity extends Activity {

  public void onCreate() {
      // needs the user data
      User.mCurrentUser...
  }

}

Как я могу решить эту проблему, не делая mCurrentUser общедоступной?

Есть ли способ создания методов в обычных классах только для тестирования?

Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете издеваться над этим.Для насмешек вы можете использовать насмешливые библиотеки, такие как Mockito & PowerMockito .

Создать метод в User для возврата значения и смоделировать этот метод.Если вы хотите использовать этот метод исключительно для тестирования, пометьте его @VisibleForTesting, чтобы ограничить доступ к нему.например;

public class User{
  private static User mCurrentUser;
  public static User getCurrentUser(){
    return mCurrentUser;
  }
}


    @RunWith(PowerMockRunner.class)
    @PrepareForTest(User.class)
    public MainActivityTest{
       @Test
       public void testCurrentUser{
        User probableUserDataFromDB = Mockito.mock(User.class); // Create a   mock instance of User class with some expected behaviour for testing purpose

        Mockito.when(probableUserDataFromDB.getUserName).thenReturn("my unique name");
        PowerMockito.mockstatic(User.class); // Readying the static methods for mocking
    Mockito.when(User.getCurrentUser).thenReturn(probableUserDataFromDB);// mock static method and return a mocked user instance with some expected behaviour

 //continue with your test.................
}

Также читайте о за и против :).

...