5

According to this SDK guide, unit-testing a Library project can be achieved by creating a standard application project, reference the Library project and then instrument the application for unit testing.

However, when I do this and launch the test application I get the message

No tests found with test runner 'JUnit 3'.

I'm using Eclipse and the Android ADT plugin, all latest versions.

Note: the projects compile just fine. The test project also installs fine to the emulator. But in the console I can see that it looks for <library>.apk, which of course doesn't exist since I'm compiling this as a library into the test project.

Anyone got this to work? And if so, what is the trickery here?

Update: after discovering and fixing a problem, which was actually including the test classes (!), the test runner now can find all tests. But, all the tests fail with the following exceptions:

java.lang.NoClassDefFoundError: <nameOfClassInLibraryProject>

nameOfClassInLibraryProject are classes defined in the library project. These classes should be compiled into the test project, and indeed, everything compiles just fine. But when running the test project, the runtime doesn't seem to find the library classes.

Peter Lillevold
  • 32,442
  • 7
  • 92
  • 127

1 Answers1

5

After much fiddling and wasted time in Eclipse I have managed to get Android Library projects to work.

According to the Working with Library Projects article:

Instead, you must compile the library indirectly, by referencing the library from a dependent application's build path, then building that application.

The problem was that I interpreted this to mean that the library project should be added to the Projects tab in Java Build Path. Doing this makes the test project compile since the library code is obviously available to the compiler. But since the library is not compiled into a .jar or .apk in itself, the library classes are never deployed to the device.

The solution is to not add the library project to Projects, rather on the Source tab, add the library /src folder using the Link Source... button. And yes, it is the library src folder, not the library project root, that must be linked into the test project.

Peter Lillevold
  • 32,442
  • 7
  • 92
  • 127
  • 1
    I had the same problem (NoClassDefFoundError), though not with a self-contained test lib project but in a test project for an application project that referenced an android library project. Your solution worked none the less, thank you very much for figuring it out. – jpo Jun 29 '11 at 10:40
  • 1
    Thanks for this. Only when I removed the project reference from my project's properties and added the library as a Library project, it worked. – Felipe Caldas May 06 '13 at 21:27
  • 1
    Its easier to add the library in your project properties, in the Android section as a library, as explained here: http://stackoverflow.com/questions/8248196/how-to-add-a-library-project-to-a-android-project – theV0ID Feb 02 '14 at 14:31
  • +1 for _a_ solution to the problem, however, I prefer the solution provided by @theV0ID as it better reflects how the library project is intended to be used... – dbm Feb 23 '14 at 13:45
  • @dbm I agree. Though I think the whole Android/Library/Project thing is quite messed up, and Eclipse doesn't help. I moved to IntelliJ a long time ago, which improves quite a bit. But I still think the cleanness of .NET projects and assemblies is miles ahead. One assembly references another assembly, boom. done. :) – Peter Lillevold Feb 25 '14 at 12:46