Android 机械分子薄片试验

Android 机械分子薄片试验,android,robolectric,robolectric-gradle-plugin,Android,Robolectric,Robolectric Gradle Plugin,我对Robolectric和我的新项目都是新手,这个项目已经通过了大量的Robolectric测试 我做了一个./gradlew清洁测试,发现测试随机失败。我怀疑@Before代码有问题,但不确定是什么 以下是JUnit报告的错误示例: java.lang.IllegalStateException: Must be called from main thread of process at android.app.FragmentManagerImpl.execPendingActions(F

我对Robolectric和我的新项目都是新手,这个项目已经通过了大量的Robolectric测试

我做了一个./gradlew清洁测试,发现测试随机失败。我怀疑@Before代码有问题,但不确定是什么

以下是JUnit报告的错误示例:

java.lang.IllegalStateException: Must be called from main thread of process
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1411)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:130)
at org.robolectric.shadows.ShadowMessageQueue.access$100(ShadowMessageQueue.java:30)
at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:95)
at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:269)
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:179)
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:160)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:143)
at org.robolectric.util.Scheduler.unPause(Scheduler.java:54)
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:266)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:306)
at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45)
at org.robolectric.util.ActivityController.create(ActivityController.java:118)
at org.robolectric.util.ActivityController.create(ActivityController.java:129)
at com.acme.android.util.FragmentRule.before(FragmentRule.java:77)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
以下是片段规则的代码:

public class FragmentRule<F extends Fragment, A extends NavigationDrawerActivity> extends ExternalResource {

private final Class<A> activityClass;
private A activity;
private F fragment;
private String initialFragmentTag = "transaction";

private FragmentRule(Class<A> activityClass) {
    this.activityClass = activityClass;
}

public static <F extends Fragment, A extends NavigationDrawerActivity> FragmentRule<F, A> newInstance(Class<A> a) {
    return new FragmentRule<>(a);
}

public static <F extends Fragment, A extends NavigationDrawerActivity> FragmentRule<F, A> forFragment(F fragment, Class<A> a) {
    FragmentRule<F, A> rule = new FragmentRule<>(a);
    rule.fragment = fragment;
    return rule;
}

public static <F extends Fragment> FragmentRule<F, FragmentActivity> newInstance() {
    return FragmentRule.newInstance(FragmentActivity.class);
}

public static <F extends Fragment> FragmentRule<F, FragmentActivity> forFragment(F fragment) {
    return FragmentRule.forFragment(fragment, FragmentActivity.class);
}

private static synchronized void initActivity(Activity activity, Fragment fragment, String initialFragmentTag) {
    activity.getFragmentManager()
        .beginTransaction()
        .replace(R.id.frame_container, fragment)
        .addToBackStack(initialFragmentTag)
        .commit();
    ShadowLooper.unPauseMainLooper();
}

public F withFragment(F fragment) {
    return withFragment(fragment, initialFragmentTag);
}

public F withFragment(F fragment, String tag) {
    this.fragment = fragment;
    this.initialFragmentTag = tag;
    initActivity(activity, fragment, initialFragmentTag);
    return fragment;
}

public A getActivity() {
    return activity;
}

@Override
protected void before() throws Throwable {
    activity = Robolectric.buildActivity(activityClass)
        .withIntent(new Intent(ShadowApplication.getInstance().getApplicationContext(), activityClass)
            .putExtra("enableProgressBar", false))
        .create()
        .start()
        .visible()
        .get();

    if (fragment != null) {
        initActivity(activity, fragment, initialFragmentTag);
    }
}

public <N extends Fragment> N getNextStartedFragment() {
    activity.getFragmentManager().executePendingTransactions();
    return (N) activity.getFragmentManager().findFragmentById(R.id.frame_container);
}

public F getFragment() {
    return fragment;
}

public static class FragmentActivity extends NavigationDrawerActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        enableProgressBar = false;
    }
}}
公共类碎片规则扩展外部资源{
私人期末班活动班;
私人活动;
私有F片段;
私有字符串initialFragmentTag=“事务”;
私有碎片规则(类activityClass){
this.activityClass=activityClass;
}
公共静态碎片规则newInstance(a类){
返回新的碎片规则(a);
}
fragment的公共静态碎片规则(F碎片,a类){
碎片规则=新碎片规则(a);
rule.fragment=片段;
返回规则;
}
公共静态碎片规则newInstance(){
返回FragmentRule.newInstance(FragmentActivity.class);
}
FRAMENT(F FRAMENT)的公共静态碎片规则{
返回FragmentRule.forFragment(fragment,FragmentActivity.class);
}
私有静态同步void initActivity(活动活动活动、片段片段、字符串initialFragmentTag){
activity.getFragmentManager()
.beginTransaction()
.更换(R.id.frame_容器,碎片)
.addToBackStack(initialFragmentTag)
.commit();
shadowloop.unpusemainlooper();
}
公共F带片段(F片段){
返回withFragment(fragment,initialFragmentTag);
}
公共F withFragment(F片段,字符串标记){
this.fragment=片段;
this.initialFragmentTag=标记;
initActivity(activity,fragment,initialFragmentTag);
返回片段;
}
公共geta活动(){
返回活动;
}
@凌驾
受保护的void before()抛出可丢弃的{
activity=Robolectric.buildActivity(activityClass)
.withIntent(新意图(ShadowApplication.getInstance().getApplicationContext(),activityClass)
.putExtra(“enableProgressBar”,false))
.create()
.start()
.visible()
.get();
if(片段!=null){
initActivity(activity,fragment,initialFragmentTag);
}
}
public N getNextStartedFragment(){
activity.getFragmentManager().executePendingTransactions();
return(N)activity.getFragmentManager().findFragmentById(R.id.frame_容器);
}
公共F getFragment(){
返回片段;
}
公共静态类碎片活动扩展了NavigationDrawerActivity{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
enableProgressBar=false;
}
}}
对不起,代码墙,不知道从哪里开始!Robolectric的版本是3.0