微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。