Тестирование инструментария WebView

#android #unit-testing #android-webview

#Android #модульное тестирование #android-webview

Вопрос:

Я хочу просто создать пользовательский WebView интерфейс в my InstrumentationTest , а затем проверить, была ли выполнена правильная инициализация.

Мой пользовательский WebView :

 public class InteractiveWebView extends WebView
{
    public InteractiveWebView(final Context context)
    {
        super(context);
        initialise(context);
    }

    public InteractiveWebView(final Context context, final AttributeSet attrs)
    {
        super(context, attrs);
        initialise(context);
    }

    public InteractiveWebView(final Context context, final AttributeSet attrs, final int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        initialise(context);
    }

    private void initialise(final Context context)
    {
        if (!isInEditMode())
        {
            if (Build.VERSION.SDK_INT >= 19)
            {
                setLayerType(View.LAYER_TYPE_HARDWARE, null);
            }
            else
            {
                setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            }

            setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
            setFocusable(true);
            setFocusableInTouchMode(true);
            requestFocus(View.FOCUS_DOWN);

            WebSettings settings = getSettings();

            settings.setJavaScriptEnabled(true);
            settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
            settings.setSupportMultipleWindows(false);
            settings.setDomStorageEnabled(true);
            settings.setDatabaseEnabled(true);
            settings.setSupportZoom(false);
            settings.setUseWideViewPort(false);

            String databasePath = context.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
            settings.setDatabasePath(databasePath);
        }
    }
}
  

The InstrumentationTest :

 @RunWith(AndroidJUnit4.class)
@SmallTest
public class InteractiveWebViewTest
{
    @Test
    public void constructors()
    {
        Context baseContext = InstrumentationRegistry.getContext();

        InteractiveWebView webView1 = new InteractiveWebView(baseContext);
        InteractiveWebView webView2 = new InteractiveWebView(baseContext, null);
        InteractiveWebView webView3 = new InteractiveWebView(baseContext, null, 1);
    }
}
  

Как вы можете видеть, на данный момент я пока ничего не утверждаю.

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

 java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference
at android.os.Handler.<init>(Handler.java:229)
at android.os.Handler.<init>(Handler.java:137)
at org.chromium.base.ThreadUtils.setUiThread(ThreadUtils.java:39)
at com.android.webview.chromium.WebViewChromiumFactoryProvider.ensureChromiumStartedLocked(WebViewChromiumFactoryProvider.java:197)
at com.android.webview.chromium.WebViewChromiumFactoryProvider.startYourEngines(WebViewChromiumFactoryProvider.java:294)
at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:218)
at android.webkit.WebView.<init>(WebView.java:606)
at android.webkit.WebView.<init>(WebView.java:542)
at android.webkit.WebView.<init>(WebView.java:525)
at android.webkit.WebView.<init>(WebView.java:512)
at android.webkit.WebView.<init>(WebView.java:502)
at android.mobileconnect.gsma.com.library.view.InteractiveWebView.<init>(InteractiveWebView.java:17)
  

Когда я нажимаю на InteractiveWebView ссылку в строке 17, она приводит меня к конструктору внутри этого класса и указывает на super(context); вызов.

Я перепробовал много других подходов, таких как расширение InstrumentationTest to be типа ActivityInstrumentationTestCase2 на случай, если это Context то, что выходит равным нулю, но я все равно получаю ту же ошибку. Я несколько раз гуглил проблему, но, похоже, не могу решить проблему, основываясь на том, что я нахожу.

Есть идеи, где я ошибаюсь?

Ответ №1:

Решил это, высмеивая InteractiveWebView , но гарантируя, что он создается в рамках выполняемого запуска в основном потоке пользовательского интерфейса:

 getActivity().runOnUiThread(new Runnable()
{
    @Override
    public void run()
    {
        // Given
        InteractiveWebView interactiveWebView = new InteractiveWebView(getActivity());
        ....
        ....
        ....
        ....
    }
}