0

APIを4.1にアップグレードした後に壊れたいくつかのテストケースの実行に問題があります(関連しているかどうかはわかりませんが、エラーはそう示唆していないようです)

java.lang.RuntimeException: java.lang.InstantiationException
at com.xtremelabs.robolectric.bytecode.RobolectricInternals.newInstanceOf(RobolectricInternals.java:32)
at com.xtremelabs.robolectric.Robolectric.newInstanceOf(Robolectric.java:130)
at com.xtremelabs.robolectric.shadows.ShadowWebView.<init>(ShadowWebView.java:21)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at com.xtremelabs.robolectric.bytecode.ShadowWrangler.shadowFor(ShadowWrangler.java:163)
at com.xtremelabs.robolectric.bytecode.ShadowWrangler$InvocationPlan.prepare(ShadowWrangler.java:311)
at com.xtremelabs.robolectric.bytecode.ShadowWrangler.methodInvoked(ShadowWrangler.java:81)
at com.xtremelabs.robolectric.bytecode.RobolectricInternals.methodInvoked(RobolectricInternals.java:111)
at android.view.View.<init>(View.java)
at android.view.ViewGroup.<init>(ViewGroup.java)
at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java)
at android.webkit.WebView.<init>(WebView.java)

ShadowWebViewの特定のクラスには、行があります

private WebSettings webSettings = Robolectric.newInstanceOf(WebSettings.class);

上記の行は

  Robolectric.java

次に、RobolectricInternals.javaにつながり、次のメソッドを実行します

   public static <T> T newInstanceOf(Class<T> clazz)

メソッドには次のソースコードがあります。

public static <T> T newInstanceOf(Class<T> clazz) {
    try {
        Constructor<T> defaultConstructor = clazz.getDeclaredConstructor();
        defaultConstructor.setAccessible(true);
        return defaultConstructor.newInstance();
    } catch (InstantiationException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    } catch (NoSuchMethodException e) {
        throw new RuntimeException(e);
    } catch (InvocationTargetException e) {
        throw new RuntimeException(e);
    }
}

スローされた例外(上記のエラーログを参照)は、この行が原因です

    defaultConstructor.newInstance();

何が原因で、これを修正する方法がわからないのですが、AndroidのWebSettings.javaは以前は非抽象クラスでしたが、現在は抽象クラスであるため、これが原因だと思いましたが、レベル12(websettings.javaが抽象として宣言されていない)などの古いAPIに切り替えても、同じエラーが発生します

4

1 に答える 1

0

WebSettingsAndroidがAPI16で抽象クラスになったのは正しいです。

API 16では、Robolectricは次の方法でWebSettingsのインスタンスを作成できなくなりました。

private WebSettings webSettings = Robolectric.newInstanceOf(WebSettings.class);

WebSettingsは抽象的であり、リフレクションによってもインスタンス化できないためです。

WebSettingsが抽象化されたため、Robolectricは何らかの形でWebSettingsの具体的なインスタンス化を提供する必要があります。そこで、android.webkit.TestWebSettingsクラスを作成し、Robolectricにそのインスタンスをで返すようにしましたShadowWebView#getSettings

特定の問題については、API 12に切り替えても、WebSettingsをインスタンス化できないということです。Robolectric自体はまだandroid-16.jarに対して構築されているため、プロジェクトをより低いAPIレベルに変更した場合でも、これが当てはまる可能性があります。Robolectric自体を変更してandroid-12.jarに対してビルドすると、WebSettingsのインスタンスが取得されますが、ShadowWebSettingsが現在のバージョンのRobolectricから削除されているため、シャドウの実装はありません。

問題の最も簡単な回避策は、プロジェクトをAPI 16に更新してから、テストケースで直接TestWebSettingsオブジェクトをインスタンス化することです。したがって、代わりに:

private WebSettings webSettings = Robolectric.newInstanceOf(WebSettings.class);

あなたは書くでしょう:

private WebSettings webSettings = new TestWebSettings();

TestWebSettingsクラスは、Robolectricソースの一部であるandroid.webkitパッケージにあります。

import android.webkit.TestWebSettings;
于 2012-10-23T23:24:29.483 に答える