Closed GoogleCodeExporter closed 8 years ago
I can't reproduce this. I was able to mock this class without problem:
public static abstract class HasFinalAndAbstractOverloads {
abstract void overload(String s);
final void overload(String s, int i) {
}
}
If you can isolate what it is about OrmLiteSqliteOpenHelper that causes
dexmaker to crash, I can fix the problem.
Original comment by jessewil...@google.com
on 15 May 2012 at 2:22
I managed to replicate the issue.
/////////////////////////////////////
public abstract class AnAbstractClass {
public abstract void bar(String s);
}
/////////////////////////////////////
public class ClassWithFinal extends AnAbstractClass
{
public final void bar(String b)
{
System.out.println(b);
}
}
/////////////////////////////////////
public void testFinal()
{
Mockito.mock(ClassWithFinal.class);
}
//////////////////////////////////////
If you run the above test, it will crash the same way that ORMLite does. I
added in a second overloaded method named "void bar(int a)" but it made no
difference on how the test ran. Hopefully this helps narrow the cause down.
java.lang.VirtualMachineError
at dalvik.system.DexFile.defineClass(Native Method)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195)
at dalvik.system.DexPathList.findClass(DexPathList.java:315)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58)
at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
at com.google.dexmaker.stock.ProxyBuilder.loadClass(ProxyBuilder.java:272)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:254)
at
com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:
51)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:41)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:41)
at org.mockito.Mockito.mock(Mockito.java:1061)
at org.mockito.Mockito.mock(Mockito.java:955)
at sandbox.test.ATest.testFinal(ATest.java:21)
Original comment by MhaleK...@gmail.com
on 15 May 2012 at 6:17
I modified ProxyBuilder.java. I adjusted the following two methods to fix the
issue. I can't run the unit tests though, so I can't cay for sure that I
didn't break anything else with these changes.
private Method[] getMethodsToProxyRecursive() {
Set<MethodSetEntry> methodsToProxy = new HashSet<MethodSetEntry>();
List<Class<?>> classChain = new LinkedList<Class<?>>();
for (Class<?> c = baseClass; c != null; c = c.getSuperclass()) {
classChain.add(0, c);
}
for (Class<?> c: classChain) {
getMethodsToProxy(methodsToProxy, c);
}
for (Class<?> c : interfaces) {
getMethodsToProxy(methodsToProxy, c);
}
Method[] results = new Method[methodsToProxy.size()];
int i = 0;
for (MethodSetEntry entry : methodsToProxy) {
results[i++] = entry.originalMethod;
}
return results;
}
private void getMethodsToProxy(Set<MethodSetEntry> sink, Class<?> c) {
for (Method method : c.getDeclaredMethods()) {
if ((method.getModifiers() & Modifier.FINAL) != 0) {
// Skip final methods, we can't override them.
sink.remove(new MethodSetEntry(method));
continue;
}
if ((method.getModifiers() & STATIC) != 0) {
// Skip static methods, overriding them has no effect.
sink.remove(method);
continue;
}
if (method.getName().equals("finalize") && method.getParameterTypes().length == 0) {
// Skip finalize method, it's likely important that it execute as normal.
continue;
}
sink.add(new MethodSetEntry(method));
}
for (Class<?> i : c.getInterfaces()) {
getMethodsToProxy(sink, i);
}
}
Original comment by MhaleK...@gmail.com
on 23 May 2012 at 8:07
Original issue reported on code.google.com by
MhaleK...@gmail.com
on 14 May 2012 at 6:28