Question

I am unit testing a class TestMe using EasyMock, and one of its methods (say method(N n)) expects a parameter of type N which has a native method (say nativeMethod()).

class TestMe {
    void method(N n) {
        // Do stuff

        n.nativeMethod();

        // Do more stuff
    }
}

method() needs to invoke N.nativeMethod() at some point, and the problem I'm having is that my Easymock mock object for N is unable to override the native method. I do not own class N but I can refactor TestMe in any way necessary.

I decided to make my own class FakeN extends N which overrides nativeMethod to do nothing:

class FakeN extends N {
    FakeN(int pointer) {
        super(pointer);
    }

    @Override
    public void nativeMethod(Object o) {
        // super.nativeMethod() is an actual native method defined as:
        // public native void nativeMethod(Object o)
        //
        // IGNORE
    }
}

but while the compiler does not complain, when I run the test it appears that N.nativeMethod() is the one being invoked and not FakeNs version.

Is there a workaround here that I can use?

Was it helpful?

Solution

The native methods can be overridden just like any other methods, unless they are declared final. Just be sure that you're calling TestMe.method(N n) with an instance of FakeN.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top