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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值