Android EasyMock错误:java.lang.VerifyError:net.sf.cglib.proxy.Enhancer
我已经为Android应用程序实现了一系列单元测试。问题是,我希望我的测试独立于服务器错误或其他记录期望的测试。看来模仿对象才是解决办法 我从EasyMock开始,遵循Vogella的教程: 问题是我得到了一个错误,我一直在网上寻找答案,但我找不到任何有用的。。。关于EasyMock错误的问题不多,但是我发现一篇帖子和我的很相似,但没有足够的帮助。我还发现了另一篇关于asm版本可能出现的错误的帖子 无论如何,问题似乎来自cglib。我在EasyMock网站上搜索了一些解释:我需要objeness(1.2)和Cglib(2.2)。我添加了.jar并遵循Vogella的建议。但它仍然不起作用 我还想知道模拟AsyncTask是一件好事,还是应该模拟AsyncTask调用的其他方法Android EasyMock错误:java.lang.VerifyError:net.sf.cglib.proxy.Enhancer,android,junit,easymock,cglib,Android,Junit,Easymock,Cglib,我已经为Android应用程序实现了一系列单元测试。问题是,我希望我的测试独立于服务器错误或其他记录期望的测试。看来模仿对象才是解决办法 我从EasyMock开始,遵循Vogella的教程: 问题是我得到了一个错误,我一直在网上寻找答案,但我找不到任何有用的。。。关于EasyMock错误的问题不多,但是我发现一篇帖子和我的很相似,但没有足够的帮助。我还发现了另一篇关于asm版本可能出现的错误的帖子 无论如何,问题似乎来自cglib。我在EasyMock网站上搜索了一些解释:我需要objeness
onPostExecute()
错误日志:
java.lang.VerifyError: net.sf.cglib.proxy.Enhancer
at org.easymock.internal.ClassProxyFactory.createEnhancer(ClassProxyFactory.java:249)
at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:159)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:59)
at org.easymock.EasyMock.createNiceMock(EasyMock.java:139)
at com.c4mprod.bhost.test.TestStudioActivity.setUp(TestStudioActivity.java:65)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)
@Override
public void setUp() throws Exception{
super.setUp();
setActivityInitialTouchMode(true);
Intent testIntent = new Intent();
testIntent.setAction(StudioActivity.ACTION_BHOST);
testIntent.putExtra(StudioActivity.EXTRA_USER_ID,525);//DEVICE'S USER
setActivityIntent(testIntent);
//asyncGeoloc is an instance of LocationTask an AsyncTask
//The error comes from this line below...
asyncGeoloc = createNiceMock(StudioActivity.LocationTask.class);
mStudioActivity = getActivity();
mWFBoasterPreviewFragment = new WeakReference<BoasterPreviewFragment>((BoasterPreviewFragment) mStudioActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_preview));
mWFStudioBoastPreviewFragment = new WeakReference<StudioBoastPreviewFragment>((StudioBoastPreviewFragment) mStudioActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_layout));
mWFRecordFragment = new WeakReference<RecordFragment>((RecordFragment) mStudioActivity.getSupportFragmentManager().findFragmentByTag(RecordFragment.TAG_FRAGMENT_NAME));
mBoasterPreviewFragment = mWFBoasterPreviewFragment.get();
mStudioBoastPreviewFragment = mWFStudioBoastPreviewFragment.get();
mRecordFragment = mWFRecordFragment.get();
}
public void testGeolocalistationLabel(){
ActivityMonitor activityMonitor = getInstrumentation().addMonitor(StudioActivity.class.getName(), null, false);
//My doInBackground() takes a LocationManager in param
LocationManager lLocation = (LocationManager) mStudioActivity.getSystemService(getInstrumentation().getTargetContext().LOCATION_SERVICE);
expect(asyncGeoloc.doInBackground(lLocation)).andReturn("JUnit, Location");
replay(asyncGeoloc);
mStudioActivity.runOnUiThread(new Runnable() {
@Override
public void run(){
mStudioBoastPreviewFragment.getGeoloc().performClick();
}
});
StudioActivity lStudioActivity = (StudioActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor,5000);
assertEquals("JUnit, Location",mStudioBoastPreviewFragment.getGeolocTextView().getText());
}
我的设置()测试代码:
java.lang.VerifyError: net.sf.cglib.proxy.Enhancer
at org.easymock.internal.ClassProxyFactory.createEnhancer(ClassProxyFactory.java:249)
at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:159)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:59)
at org.easymock.EasyMock.createNiceMock(EasyMock.java:139)
at com.c4mprod.bhost.test.TestStudioActivity.setUp(TestStudioActivity.java:65)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)
@Override
public void setUp() throws Exception{
super.setUp();
setActivityInitialTouchMode(true);
Intent testIntent = new Intent();
testIntent.setAction(StudioActivity.ACTION_BHOST);
testIntent.putExtra(StudioActivity.EXTRA_USER_ID,525);//DEVICE'S USER
setActivityIntent(testIntent);
//asyncGeoloc is an instance of LocationTask an AsyncTask
//The error comes from this line below...
asyncGeoloc = createNiceMock(StudioActivity.LocationTask.class);
mStudioActivity = getActivity();
mWFBoasterPreviewFragment = new WeakReference<BoasterPreviewFragment>((BoasterPreviewFragment) mStudioActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_preview));
mWFStudioBoastPreviewFragment = new WeakReference<StudioBoastPreviewFragment>((StudioBoastPreviewFragment) mStudioActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_layout));
mWFRecordFragment = new WeakReference<RecordFragment>((RecordFragment) mStudioActivity.getSupportFragmentManager().findFragmentByTag(RecordFragment.TAG_FRAGMENT_NAME));
mBoasterPreviewFragment = mWFBoasterPreviewFragment.get();
mStudioBoastPreviewFragment = mWFStudioBoastPreviewFragment.get();
mRecordFragment = mWFRecordFragment.get();
}
public void testGeolocalistationLabel(){
ActivityMonitor activityMonitor = getInstrumentation().addMonitor(StudioActivity.class.getName(), null, false);
//My doInBackground() takes a LocationManager in param
LocationManager lLocation = (LocationManager) mStudioActivity.getSystemService(getInstrumentation().getTargetContext().LOCATION_SERVICE);
expect(asyncGeoloc.doInBackground(lLocation)).andReturn("JUnit, Location");
replay(asyncGeoloc);
mStudioActivity.runOnUiThread(new Runnable() {
@Override
public void run(){
mStudioBoastPreviewFragment.getGeoloc().performClick();
}
});
StudioActivity lStudioActivity = (StudioActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor,5000);
assertEquals("JUnit, Location",mStudioBoastPreviewFragment.getGeolocTextView().getText());
}
好的,如果有人有更多关于它的信息或者可以回答我关于模仿AsyncTask
好还是不好的问题
谢谢你的帮助 A
VerifyError
表示您试图使用不同版本的库。在本例中,看起来EasyMock使用的CGLib版本与程序的其他部分不同
我看到您提到您将CGLib添加到类路径中,如果首先找到另一个错误的版本,那么您添加的版本可能不会被类加载器使用。我建议您将CGLib jar移动到类路径的前面,以便首先找到它
如果仍然出现错误,则可能需要使用相同版本的CGLib重新编译库。如果对CGLib的更改不兼容,这可能会导致编译时错误,因此您可能需要进行一些代码更改
您是如何构建代码的?一些较新的构建工具(如Maven)可以为您解决这些问题。根据您的堆栈跟踪,您正在android上使用EasyMock。Android没有完全实现Java6,特别是缺少一些java.beans类(例如
java.beans.PropertyDescriptor
)。这些类有时由cglib使用
如果您在ClassProxyFactory.java:249设置断点,您可能会发现缺少哪个类