AndroidJUnit4 :- GrantPermissionRule 无法允许单元测试的运行时权限?

问题描述

我正在为我的广播接收器类编写 AndroidJUnit4 测试用例,其中有位置和电话状态的运行时权限来执行一些代码。我需要什么,我需要使用 GrantPermissionRule 授予运行时权限。

请检查我现在得到的以下异常

I/TestRunner:开始:testOnReceive(com.xxx.xxxxx.receiver.MyClasstest) I/UiAutomationShellCmd:请求权限:pm grant com.xxxxx.test android.permission.ACCESS_FINE_LOCATION E/GrantPermissionCallable: 权限: android.permission.ACCESS_FINE_LOCATION 不能被授予! E/TestRunner: 失败: testOnReceive(com.xxxx.xxx.receiver.MyClasstest) ----- 开始异常 ----- E/TestRunner: junit.framework.AssertionFailedError: 授予权限失败,详情见 logcat 在 junit.framework.Assert.fail(Assert.java:50) 在 androidx.test.runner.permission.PermissionRequester.requestPermissions(PermissionRequester.java:111) 在 androidx.test.rule.GrantPermissionRule$RequestPermissionStatement.evaluate(GrantPermissionRule.java:128) 在 org.junit.rules.RunRules.evaluate(RunRules.java:20) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 在 org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:57) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runchildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:154) 在 org.junit.runners.Suite.runchild(Suite.java:128) 在 org.junit.runners.Suite.runchild(Suite.java:27) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runchildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:115) 在 androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56) 在 androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:395) 在 android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2084) ----- 结束异常 ----- I/TestRunner:完成:testOnReceive(com.xx.xxxxx.receiver.MyClasstest) junit.framework.AssertionFailedError: 无法授予权限,详情请参阅 logcat 在 junit.framework.Assert.fail(Assert.java:50) 在 androidx.test.runner.permission.PermissionRequester.requestPermissions(PermissionRequester.java:111) 在 androidx.test.rule.GrantPermissionRule$RequestPermissionStatement.evaluate(GrantPermissionRule.java:128) 在 org.junit.rules.RunRules.evaluate(RunRules.java:20) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 在 org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:78) 在 org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:57) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runchildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:154) 在 org.junit.runners.Suite.runchild(Suite.java:128) 在 org.junit.runners.Suite.runchild(Suite.java:27) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runchildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:115) 在 androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56) 在 androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:395) 在 android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2084)

并请检查我使用下面的 GrantPermissionRule 的代码

import android.content.Context;
import android.content.Intent;

import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.GrantPermissionRule;


import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * MyClass Tester.
 *
 * @author <Authors name>
 * @version 1.0
 * @since <pre>Nov 5,2020</pre>
 */
@RunWith(AndroidJUnit4.class)
public class MyClasstest {

    private Context context;
    private MyClass test;



    @Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(
            android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.permission.READ_PHONE_STATE);



    @Before
    public void before() throws Exception {

        context = InstrumentationRegistry.getInstrumentation().getTargetContext();

        test = new MyClass();
        System.out.print(getClass().getSimpleName() + " test start");
    }

    @After
    public void after() throws Exception {
        System.out.print(getClass().getSimpleName() + " test end");
    }

    /**
     * Method: onReceive(Context context,Intent intent)
     */
    @Test
    public void testOnReceive() throws Exception {
        //Todo: Test goes here...

        if (SdkAppHelper.getInstance(context).isPermissionsAllowed()) {
            test.onReceive(context,new Intent().setAction(SdkAppConstants.ACTION_START_1));
            test.onReceive(context,new Intent().setAction(SdkAppConstants.ACTION_UPLOAD_11111_DATA_MANUALLY));
            test.onReceive(context,new Intent().setAction(SdkAppConstants.ACTION_INITIALIZE_DEVICE_ID));
        }
    }

} 

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)