Не удается получить имя приложения из манифеста в тесте инструментовки - PullRequest
0 голосов
/ 25 июня 2018

Мое приложение для Android состоит из нескольких модулей.В моем модуле данных я хочу получить имя приложения.

Пока что я делаю это, следуя этому решению , которое возвращает имя приложения, объявленное в манифесте приложения.:

class Registry {
  public Registry(Context context) {
    mContext = context;
  }
  public String getApplicationName() {
    ApplicationInfo applicationInfo = mContext.getApplicationInfo();
    int stringId = applicationInfo.labelRes;
    return stringId == 0 ? applicationInfo.nonLocalizedLabel.toString() : context.getString(stringId);
  }
  private Context mContext;
}

Это прекрасно работает при запуске моего приложения: applicationInfo.labelRes возвращает идентификатор строки, который затем переводится в строку.

Но в моих инструментах поведение не такоеtest: applicationInfo.labelRes возвращает 0;это приводит к NullPointerException, поскольку applicationInfo.nonLocalizedLabel является нулевым.

Мой тест следующий:

@RunWith(AndroidJUnit4.class)
public class RegistryTest {

  @Test
  public void testGetApplicationName() {
    Context context = InstrumentationRegistry.getContext();
    Registry registry = new Registry(context);
    String applicationName = registry.getApplicationName();
    assertEquals("Foo", applicationName);
  }
}

Насколько я понимаю, тест не настроен на использование манифеста приложения,Какие есть варианты, чтобы в моем тесте было настроено подходящее имя приложения?

Спасибо,

1 Ответ

0 голосов
/ 25 июня 2018

Из документа за InstrumentationRegistry.getContext()

Возвращает контекст пакета этого инструментария

Итак, это контекст вашего тестового приложения. Если вы проверите InstrumentationRegistry.getTargetContext()

Возвращает контекст для инструментируемого целевого приложения

Итак, вы должны использовать InstrumentationRegistry.getTargetContext(), поскольку он представляет контекст приложения.

EDIT:

Как уже говорилось, если у вас есть модули A и B, в то время как B зависит от A, тогда вы не можете получить имя приложения для A с помощью инструментального теста в B, так как окончательный APK объединяется из обоих модулей в один и перезаписывается имя от А.

...