1

在尝试运行在后台调用 ShinobiControls 的 Robolectric 测试时,我遇到了这个奇怪的 VerifyError。我试过 -noverify 选项,但它似乎不起作用,或者我把它放在错误的地方。

我正在使用 Retrolambda、Java 8、Robolectric (3.0) 和 Shinobi Premium (1.8.0)。

java.lang.VerifyError: Expecting a stackmap frame at branch target 18
Exception Details:
  Location:
    com/shinobicontrols/charts/ChartFragment.onResume()V @8: ifnull
  Reason:
    Expected stackmap frame at this location.
  Bytecode:
    0x0000000: 2ab7 000b 2ab4 0006 c600 0a2a b400 06b6
    0x0000010: 0012 b1                                

    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.newInstance(Class.java:412)
    at android.app.Fragment.instantiate(Fragment.java:611)
    at android.app.Fragment.instantiate(Fragment.java:582)
    at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2108)
    at android.app.Activity.onCreateView(Activity.java:5282)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377)
    at android.app.Activity.setContentView(Activity.java:2144)
    at com.example.android.MainActivity.onCreate(MainActivity.java:132)
4

1 回答 1

0

基本上,我们正在伪造 shinobi 的观点。我们有下一个构造:

public class ShinobyView {
    @VisibleForTesting
    @NonNull
    protected ChartView getShinobiChart(@NonNull final LayoutInflator inflator, @NonNull final ViewGroup chartContainer) {
        return inflater.inflate(R.layout.shinobi_chart, chartContainer, false);
    }

    @NonNull
    public View createView(@NonNull context context) {
       ...
       ChratView view = getShinobiChart(inflator, container);
       container.addView(view, <some layout params>);
       ...
    }
}

在测试中我们伪造它:

public class TestShinobyView {
    @Override
    @NonNull
    protected ChartView 
    getShinobiChart(@NonNull final LayoutInflator inflator, @NonNull final ViewGroup chartContainer) {
        return new View(activity);
    }
}

如果您想验证您是否也正确设置了 shinobi 图表,那么您需要模拟ShinobiChart并返回,而不是View伪造的ShinobiView

于 2016-01-29T16:28:32.653 回答