2012-06-07 9 views
8

Ich bin Unit-Tests eine Klasse TestMe mit EasyMock, und eine seiner Methoden (sagen method(N n)) erwartet einen Parameter des Typs N, die eine native Methode hat (etwa nativeMethod()).Kann eine native Methode in einer Java-Klasse in Android/dalvik überschrieben werden?

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

     n.nativeMethod(); 

     // Do more stuff 
    } 
} 

method() muss N.nativeMethod() an einem gewissen Punkt berufen, und das Problem, das ich habe, ist, dass mein EasyMock Mock-Objekt für N nicht in der Lage ist, die native Methode außer Kraft zu setzen. Ich besitze Klasse N nicht, aber ich kann TestMe in irgendeiner notwendigen Weise umgestalten.

ich beschlossen, meine eigene Klasse FakeN extends N die nativeMethod Vorrang zu machen, nichts zu tun:

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 
    } 
} 

aber während der Compiler, nicht beschweren, wenn ich den Test laufen scheint es, dass N.nativeMethod() derjenige wird aufgerufen und nicht FakeN s Version.

Gibt es hier einen Workaround, den ich verwenden kann?

Antwort

5

Die Methoden native können wie alle anderen Methoden außer Kraft gesetzt werden, sofern sie nicht als final deklariert sind. Seien Sie sicher, dass Sie TestMe.method(N n) mit einer Instanz von FakeN sind aufgerufen wird.

+0

Das ist, was ich aus den Kommentaren dachte an [diese Seite] (http://www.coderanch.com/t/380733/java/java/Overriding-Native-Method-java-io), aber es schien nicht zu Arbeit. Ich werde zurückgehen und nachsehen, ob ich etwas vermasselt habe. – scorpiodawg

+3

Stellt fest, dass native Methoden durch nicht-native überschrieben werden können und umgekehrt. 'nativ' scheint nicht Teil der Signatur zu sein. – scorpiodawg