当我为带有参数的方法创建模拟时出现 NoClassDefFoundError
NoClassDefFoundError when I create mock for method with parameters
我有以下 class:
public class SomeClass {
private int digit;
public SomeClass(int i){
digit = i;
}
public int someMethod(int i){
/*
* Some work
*/
}
/**
* Other method
*/
}
当我想用 Mockito 创建这个 class 的间谍时,我得到 java.lang.NoClassDefFoundError
但是当我将方法更改为
public int someMethod(){
// some work
}
一切正常,没有错误。我做错了什么?
我的测试 class:
@PrepareForTest ({SomeClass.class})
public class SomeClassTest extends AndroidTestCase {
private SomeClass someClass = null;
@Override
protected void setUp() throws Exception {
super.setUp();
// This is necessary on devices in order to avoid bugs with instantiation order
System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());
SomeClass localSomeClass = new SomeClass(10);
someClass = Mockito.spy(localSomeClass);
Mockito.doReturn(5).when(someClass).someMethod();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testCorrectExemption(){
/**
* Test code
*/
}
}
编辑: 堆栈跟踪异常
java.lang.NoClassDefFoundError: org.mockito.internal.matchers.Equals
at org.mockito.internal.invocation.ArgumentsProcessor.argumentsToMatchers(ArgumentsProcessor.java:47)
at org.mockito.internal.invocation.InvocationMatcher.<init>(InvocationMatcher.java:34)
at org.mockito.internal.invocation.MatchersBinder.bindMatchers(MatchersBinder.java:26)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:50)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:38)
at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49)
at SomeClass_Proxy.testMethod(SomeClass_Proxy.generated)
at ru.test.SomeClassTest.setUp(SomeClassTest.java:47)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)
我不认为这与模拟有任何关系。 NoClassDefFoundError 错误即将到来,因为您的 SomeClass.class 在执行期间不在 class 路径中。输入 class 路径,错误就会消失。
我用 mockito-all.jar
替换 mockito-core.jar
解决了问题
我有以下 class:
public class SomeClass {
private int digit;
public SomeClass(int i){
digit = i;
}
public int someMethod(int i){
/*
* Some work
*/
}
/**
* Other method
*/
}
当我想用 Mockito 创建这个 class 的间谍时,我得到 java.lang.NoClassDefFoundError
但是当我将方法更改为
public int someMethod(){
// some work
}
一切正常,没有错误。我做错了什么?
我的测试 class:
@PrepareForTest ({SomeClass.class})
public class SomeClassTest extends AndroidTestCase {
private SomeClass someClass = null;
@Override
protected void setUp() throws Exception {
super.setUp();
// This is necessary on devices in order to avoid bugs with instantiation order
System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());
SomeClass localSomeClass = new SomeClass(10);
someClass = Mockito.spy(localSomeClass);
Mockito.doReturn(5).when(someClass).someMethod();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testCorrectExemption(){
/**
* Test code
*/
}
}
编辑: 堆栈跟踪异常
java.lang.NoClassDefFoundError: org.mockito.internal.matchers.Equals
at org.mockito.internal.invocation.ArgumentsProcessor.argumentsToMatchers(ArgumentsProcessor.java:47)
at org.mockito.internal.invocation.InvocationMatcher.<init>(InvocationMatcher.java:34)
at org.mockito.internal.invocation.MatchersBinder.bindMatchers(MatchersBinder.java:26)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:50)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:38)
at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49)
at SomeClass_Proxy.testMethod(SomeClass_Proxy.generated)
at ru.test.SomeClassTest.setUp(SomeClassTest.java:47)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)
我不认为这与模拟有任何关系。 NoClassDefFoundError 错误即将到来,因为您的 SomeClass.class 在执行期间不在 class 路径中。输入 class 路径,错误就会消失。
我用 mockito-all.jar
mockito-core.jar
解决了问题