Teste de unidade Android usando ant com projeto de biblioteca
arece que as ferramentas mais recentes do SDK para Android ainda não suportam adequadamente o teste de aplicativos que contêm projetos de bibliotecas vinculada
Tenho um projeto com a seguinte configuração:
TestLib (projeto da biblioteca android) <- TestMain (projeto android) <- TestMainTest (projeto de teste da unidade android)
Criei todos esses projetos no eclipse e useiandroid update (test-/lib-)project ...
para gerar obuild.xml
et. al.
O problema começa assim que você tem uma classe no TestMain InheritAddition.java
no meu exemplo) que herda de uma classe no TestLib Addition.java
) e você deseja referenciar esta classe no teste de unidade InheritAdditionTest.java
).
public class Addition {
public int add2(int o1, int o2) {
return o1 + o2;
}
}
TestMainpublic class InheritAddition extends Addition {
public int sub(int p1, int p2) {
return p1 - p2;
}
}
TestMainTestpublic class InheritAdditionTest extends AndroidTestCase {
public void testSub() {
Assert.assertEquals(2, new InheritAddition().sub(3, 1));
}
}
Ao criar na linha de comando, o resultado é o seguinte:
W/ClassPathPackageInfoSource(14871): Caused by: java.lang.NoClassDefFoundError: org/test/main/InheritAddition W/ClassPathPackageInfoSource(14871): ... 26 more W/ClassPathPackageInfoSource(14871): Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation W/ClassPathPackageInfoSource(14871): at dalvik.system.DexFile.defineClass(Native Method) W/ClassPathPackageInfoSource(14871): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195) W/ClassPathPackageInfoSource(14871): at dalvik.system.DexPathList.findClass(DexPathList.java:315) W/ClassPathPackageInfoSource(14871): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58) W/ClassPathPackageInfoSource(14871): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) W/ClassPathPackageInfoSource(14871): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) W/ClassPathPackageInfoSource(14871): ... 26 more W/dalvikvm(14871): Class resolved by unexpected DEX: Lorg/test/main/InheritAddition;(0x41356250):0x13772e0 ref [Lorg/test/lib/Addition;] Lorg/test/lib/Addition;(0x41356250):0x13ba910
Encontrei uma solução alternativa que funciona para o eclipse:
Isso faz o truque, mas estou procurando uma solução que funcione com a ANT (mais precisamente, estou procurando uma solução que funcione nos dois ao mesmo tempo
A abordagem documentada (alterando build.xml para incluir jars do projeto principal no caminho da classe) não é aplicável aqui, pois o projeto de amostra não usa nenhum jars da biblioteca (também acredito que esse problema específico agora seja corrigido com o SDK ferramentas r16).
Acho que a maneira de resolver a força bruta é tentar remover de alguma forma as dependências deTestMainTest
paraTestLib
(modificandoproject.properties
) e, em vez disso, consiga hackear o script de compilação para colocar os jars criados no caminho da classe (substitua o-compile
target com algo que modifica o caminho da classe parajavac
). Como tenho um longo histórico de tentativas de acompanhar as alterações na cadeia de ferramentas do SDK do Android, essa não é realmente a minha opção favorita, pois é a) bastante complicada eb) requer modificações constantes build.xml
sempre que a cadeia de ferramentas mudar (o que é bastante frequente
Então, estou procurando idéias de como fazer com que essa configuração funcione sem usar a marreta. Talvez esteja faltando algo totalmente óbvio, mas para mim esse caso de uso é bastante padrão e tenho dificuldade em entender por que isso não é suportado imediatament