Run as JUnit Plug-in test 出错:java.lang.IllegalAccessError

本文探讨了在Eclipse环境下进行插件单元测试时遇到的问题,特别是当测试类与被测试类位于不同插件但具有相同包名时出现的java.lang.IllegalAccessError错误。文中提供了解决方案,包括通过创建fragment或将方法提取到独立类中来规避这一限制。

测试类与被测试类在不同的Plug-in, 但有相同的包名

 

org.myym.myplugin

package org.myym.myplugin;

public class MyClass {
	int myMethod() {
		return 1;
	}
}

 

org.myym.myplugin.test

package org.myym.myplugin;

import static org.junit.Assert.*;
import org.junit.Test;
import org.myym.myplugin.MyClass;

public class MyClassTest {
	MyClass myClass = new MyClass();
	
	@Test
	public void myMethodReturnOne(){
		assertEquals(1, myClass.myMethod());
	}
}

 

当Run as JUnit test时没有错误, 但当Run as JUnit Plug-in test时报错:java.lang.IllegalAccessError

 

这是因为Eclipse的插件机制,MyClass和MyClassTest被装载在各自不同的ClassLoader中,从而不能调用包可见的方法。

 

可以将org.myym.myplugin.test创建成org.myym.myplugin的fragment使得装载在同一个ClassLoader中. see http://www.modumind.com/2007/06/20/unit-testing-plug-ins-with-fragments/

 

比较简单而彻底的方法是不要利用package visible来测试方法。如果该方法比较复杂必须单独测试,可以将它Extract成单独的类来测试。

09-02 11:58:22.519 28709 28732 I TestRunner: started: initializationError(com.example.myapplication.ExampleInstrumentedTest) 09-02 11:58:22.522 28709 28732 E TestRunner: failed: initializationError(com.example.myapplication.ExampleInstrumentedTest) 09-02 11:58:22.522 28709 28732 E TestRunner: ----- begin exception ----- 09-02 11:58:22.522 28709 28732 E TestRunner: java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner 09-02 11:58:22.522 28709 28732 E TestRunner: 09-02 11:58:22.522 28709 28732 E TestRunner: 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:129) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:121) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.ext.junit.runners.AndroidJUnit4.<init>(AndroidJUnit4.java:56) 09-02 11:58:22.522 28709 28732 E TestRunner: at java.lang.reflect.Constructor.newInstance0(Native Method) 09-02 11:58:22.522 28709 28732 E TestRunner: at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:70) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.AndroidRunnerBuilder.runnerForClass(AndroidRunnerBuilder.java:152) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.DirectTestLoader.doCreateRunner(DirectTestLoader.java:45) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.TestLoader.getRunnersFor(TestLoader.java:64) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:842) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:663) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:437) 09-02 11:58:22.522 28709 28732 E TestRunner: at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2210) 09-02 11:58:22.522 28709 28732 E TestRunner: Caused by: java.lang.reflect.InvocationTargetException 09-02 11:58:22.522 28709 28732 E TestRunner: at java.lang.reflect.Constructor.newInstance0(Native Method) 09-02 11:58:22.522 28709 28732 E TestRunner: at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:112) 09-02 11:58:22.522 28709 28732 E TestRunner: ... 17 more 09-02 11:58:22.522 28709 28732 E TestRunner: Caused by: org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.example.myapplication.ExampleInstrumentedTest': 09-02 11:58:22.522 28709 28732 E TestRunner: 1. No runnable methods 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.runners.ParentRunner.validate(ParentRunner.java:525) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.runners.ParentRunner.<init>(ParentRunner.java:92) 09-02 11:58:22.522 28709 28732 E TestRunner: at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:74) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:50) 09-02 11:58:22.522 28709 28732 E TestRunner: at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:55) 09-02 11:58:22.522 28709 28732 E TestRunner: ... 20 more 09-02 11:58:22.522 28709 28732 E TestRunner: ----- end exception ----- 09-02 11:58:22.525 28709 28732 I TestRunner: finished: initializationError(com.example.myapplication.ExampleInstrumentedTest) java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:129) at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:121) at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82) at androidx.test.ext.junit.runners.AndroidJUnit4.<init>(AndroidJUnit4.java:56) ... 14 trimmed Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:343) at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:112) ... 17 more Caused by: org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.example.myapplication.ExampleInstrumentedTest': 1. No runnable methods at org.junit.runners.ParentRunner.validate(ParentRunner.java:525) at org.junit.runners.ParentRunner.<init>(ParentRunner.java:92) at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:74) at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:50) at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:55) ... 20 more
最新发布
09-03
当出现 `java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner` 错误,且原因是测试类无运行方法时,可按以下方法解决: ### 添加测试方法 JUnit 测试框架要求测试类中至少有一个使用 `@Test` 注解标记的方法,才能被视为可运行的测试。若测试类中没有此类方法,测试运行器将无法找到可执行的测试,从而抛出错误。以下是一个示例: ```java import org.junit.Test; public class MyTestClass { @Test public void testExample() { // 这里可以编写具体的测试逻辑 // 例如,调用某个方法并验证其结果 int result = 2 + 2; assert result == 4; } } ``` ### 检查方法签名 测试方法必须是 `public` 且返回类型为 `void`,并且不能有参数。若方法签名不符合这些要求,JUnit 将无法识别其为有效的测试方法。以下是不符合和符合要求的方法示例: ```java import org.junit.Test; public class MyTestClass { // 不符合要求的方法,因为它不是 public @Test private void testExample1() { // 测试逻辑 } // 不符合要求的方法,因为它有返回值 @Test public int testExample2() { return 0; } // 不符合要求的方法,因为它有参数 @Test public void testExample3(int param) { // 测试逻辑 } // 符合要求的方法 @Test public void testExample4() { // 测试逻辑 } } ``` ### 检查注解 确保测试方法使用了正确的 `@Test` 注解。若使用了错误的注解或忘记添加注解,JUnit 将无法识别该方法为测试方法。例如: ```java import org.junit.Test; public class MyTestClass { // 错误:忘记添加 @Test 注解 public void testExample() { // 测试逻辑 } } ``` 应修改为: ```java import org.junit.Test; public class MyTestClass { @Test public void testExample() { // 测试逻辑 } } ``` ### 检查依赖 确保项目中正确引入了 JUnit 依赖。若依赖缺失或版本不兼容,可能会导致测试运行器无法正常工作。在 `build.gradle` 文件中添加以下依赖: ```groovy testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' ``` ### 清理和重建项目 有时候,项目中的缓存文件可能会导致问题。可以尝试清理项目并重新构建:在 Android Studio 中,选择 `Build` -> `Clean Project` 清理项目,然后选择 `Build` -> `Rebuild Project` 重新构建项目。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值