Problems with the JMUnit TestSuite class
I attempted to use the ‘JMUnit’ unit testing library that is shipped with NetBeans for the
first time today. I created a couple of simple TestCase
classes and a TestSuite
that
combines each of these. However, every time I attempted to load the test suite I was
presented with the following exception:
result 0: first.AdderTest
java.lang.SecurityException: MIDlet not constructed by createMIDlet.
at com.sun.midp.midlet.MIDletStateHandler.newMIDletPeer(), bci=24
at javax.microedition.midlet.MIDlet.(), bci=9
at jmunit.framework.cldc10.Assertion.(), bci=1
at jmunit.framework.cldc10.Test.(), bci=1
at jmunit.framework.cldc10.TestCase.(), bci=2
at first.AdderTest.(), bci=4
at java.lang.Class.newInstance(), bci=0
> at jmunit.framework.cldc10.TestSuite.(), bci=57
at java.lang.Class.newInstance(), bci=0
at com.sun.midp.main.CldcMIDletLoader.newInstance(), bci=46
at com.sun.midp.midlet.MIDletStateHandler.createMIDlet(), bci=66
at com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet(), bci=17
at com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=27
at com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
at com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
at com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
at com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26
The above exception indicates that the problem originated from the constructor of my test case class.
// AdderTest.java
import jmunit.framework.cldc10.*;
public class AdderTest extends TestCase {
public AdderTest() {
// This is where the problem occurs!
super(1, "AdderTest");
}
public void test(int testNumber) throws Throwable {
// Note: 'testNumber' doesn't matter as there is only one test!
int result = new Adder().add(1, 2);
System.out.println("1 + 2 = " + result);
}
}
// Adder.java
public class Adder {
public int add(int a, int b) {
return a + b;
}
}
As you can see from the above source the constructor in question was extremely simple. The
exception was being generated as a result of instantiating the AdderTest
class.
Surprisingly no such exceptions were being shown when test suites were not being used.
After some digging I discovered that this problem is in fact due to a security constraint that is imposed by the J2ME specification. A MIDlet cannot attempt to create another MIDlet from its constructor (See: http://sites.google.com/site/franciscobenitezleon/projects/jmunit-revised).
Thankfully Francisco Benítez León has come up with a solution to this problem by providing several customizations that allow us to workaround this problem. The various driver classes are no longer derived from a MIDlet, and thus avoid the security exception. This does, however, mean that we must create a simple MIDlet that kick-starts the testing process.
Refer to the following link for a download of this library patch and for further information: http://sites.google.com/site/franciscobenitezleon/projects/jmunit-revised/jmunit-revised-2-0