I wanted to add a section into our application which allows users to upload a jar containing JUnit tests. I want to be able to run these jar's tests within my java application. I can get the Class to be loaded from the Jar but when it goes to run the test I get an error
Failure: initializationError(com.sample.Test): org/openqa/selenium/Capabilities
Problem
If I run the same test with putting the Test class within the classpath and call it via the class directly it works correctly and runs the test within Appium
JUnitCore junit = new JUnitCore();
Result result = junit.run(Test.class);
When I go to load the same class from the jar it fails.
Does anyone know why this would be happening? Maven is setup to import all the Selenium/Appium jars correctly. If I run the test directly within my application there is no issue just when the class is taken from the jar.
import org.openqa.selenium.remote.DesiredCapabilities;
Code
// not on class path File jarLocation = new File("C:/Work/testcases-0.0.1.jar");
File jarLocation = new File("lib/testcases-0.0.1.jar"); // on classpath
try {
JarInputStream testJarFile;
testJarFile = new JarInputStream(new FileInputStream(jarLocation));
while (true) {
JarEntry testJar = testJarFile.getNextJarEntry();
if (testJar == null) {
break;
}
if ((testJar.getName().endsWith(".class"))) {
String file = testJar.getName();
String classname = file.replace('/', '.').substring(0, file.length() - 6);
try
{
Class<?> c = Class.forName(classname);
JUnitCore junit = new JUnitCore();
Result result = junit.run(c.getClass());
for (Failure failure : result.getFailures()) {
Logger.info("Failure: " + failure.toString());
}
}
catch (Throwable e)
{
Logger.error("WARNING: failed to instantiate " + classname + " from " + file);
Logger.error("ERROR: Exception " + e);
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Test Class
public class Test{
@Test
public void test() throws MalformedURLException {
//Grab file - device info
File appDir = new File("lib");
File app = new File(appDir, "deviceinfo.apk");
//Setup as android device
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID);
cap.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Device");
//Run app
cap.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, "20"); //only wait 20 sec
cap.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);
//Close app
driver.closeApp();
}
}