Mockito.mockConstruction не возвращает макет объекта в тестируемом классе

#java #junit #mockito

#java #юнит #мокито #junit #mockito

Вопрос:

Я пытаюсь написать недостающие тесты для плагина capacitor Android, написанного на Java, который использует библиотеку AdMob от Google.

Функция, которую я пытаюсь протестировать, имеет new AdView() вызов, который возвращается null , даже когда конструктор издевается с помощью макета конструкции объекта Mockito, и я не совсем уверен, почему.

Я пытаюсь создать новую AdView внутри тестовой угрозы, и это работает.

Это текущий тест (в нем пока нет никаких утверждений, потому что я просто пытаюсь передать создание представления:

     @Test
    public void npa_requests_for_banner_when_specified_inside_options() {
        sut = new AdMob();
        try (MockedStatic<AdOptions> adOptionsStaticMocked = Mockito.mockStatic(AdOptions.class)) {
            adOptionsStaticMocked.when(AdOptions::getFactory).thenReturn(adOptionsFactoryMock);
            
            try (MockedConstruction<AdView> adViewMocked = Mockito.mockConstruction(AdView.class)) {
                Context mockedContext = mock(Context.class);
                AdView adView = new AdView(mockedContext);


                sut.showBanner(pluginCallMock);
            }
        }
    }
  

и showBanner соответствующий код:

   @PluginMethod
  public void showBanner(PluginCall call) {

    if (mAdView != null) {
      return;
    }

    final AdOptions adOptions = AdOptions
      .getFactory()
      .createBannerOptions(call);

    setTestDevicesIfNeeded(adOptions.isTesting);

    try {
      mAdView = new AdView(getContext()); // THIS BREAKS! NO MOCK IS RETURNED
      mAdView.setAdSize(adOptions.adSize.size);
        
      mAdViewLayout = new RelativeLayout(getContext());
      mAdViewLayout.setHorizontalGravity(Gravity.CENTER_HORIZONTAL);
      mAdViewLayout.setVerticalGravity(Gravity.BOTTOM);

      // More Code here...
    } catch (Exception ex) {
      call.error(ex.getLocalizedMessage(), ex);
    }
  }

  

mAdView = new AdView(getContext()) Часть — это то, где код ломается.

Кто-нибудь может сказать мне, что я делаю не так?

Ответ №1:

Может быть, это поможет кому-то новому в плагинах конденсаторов на Java, как я.

Проблема заключалась в том, что getContext() возвращался null … То , что я сделал , было:

     @Test
    public void npa_requests_for_banner_when_specified_inside_options() {
        sut = new AdMob() {
            @Override
            public Context getContext() {
                return mockedContext;
            }
        };
        try (MockedStatic<AdOptions> adOptionsStaticMocked = Mockito.mockStatic(AdOptions.class)) {
            adOptionsStaticMocked.when(AdOptions::getFactory).thenReturn(adOptionsFactoryMock);
            
            try (MockedConstruction<AdView> adViewMocked = Mockito.mockConstruction(AdView.class)) {
                Context mockedContext = mock(Context.class);
                AdView adView = new AdView(mockedContext);


                sut.showBanner(pluginCallMock);
            }
        }
    }