Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to override a native method in a Java class in Android/dalvik?

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?

like image 298
scorpiodawg Avatar asked Jun 07 '12 22:06

scorpiodawg


1 Answers

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.

like image 61
tibtof Avatar answered Oct 19 '22 09:10

tibtof