Wie ein JNIEnv mock in C / C ++ erstellen
-
03-07-2019 - |
Frage
Ich schreibe einige JNI Code in C, die ich möchte mit cunit testen. Um die JNI-Funktionen aufzurufen, ich brauche eine gültige JNIEnv Struktur zu erstellen.
Wer weiß, ob es einen Mockframework für einen solchen Zweck ist, oder wer kann mir einige Hinweise geben, wie ein Mock JNIEnv struct selbst erstellen?
Lösung
jni.h enthält die komplette Struktur für JNIEnv_, einschließlich der "jump table" JNINativeInterface_. Sie könnten Ihre eigene JNINativeInterface_ (zeigt auf Mock-Implementierungen) erstellen und ein JNIEnv_ davon instanziiert.
In Reaktion auf den Kommentare: (I nicht am anderen aussehen SO Frage, die Sie verweisen)
#include "jni.h"
#include <iostream>
jint JNICALL MockGetVersion(JNIEnv *)
{
return 23;
}
JNINativeInterface_ jnini = {
0, 0, 0, 0, //4 reserved pointers
MockGetVersion
};
// class Foo { public static native void bar(); }
void Java_Foo_bar(JNIEnv* jni, jclass)
{
std::cout << jni->GetVersion() << std::endl;
}
int main()
{
JNIEnv_ myjni = {&jnini};
Java_Foo_bar(&myjni, 0);
return 0;
}
Andere Tipps
Mocking JNI klingt wie eine Welt des Schmerzes zu mir. Ich glaube, Sie sind wahrscheinlich besser dran, die Anrufe in Java implementiert spöttisch und mit JUnit die Funktionalität auf der Java-Seite zu testen
Zitat: ". Jnimock oben auf gmock implementiert Es bietet zwei C ++ Klassen 'JNIEnvMock' und 'JavaVMMock' separat mock 'JNIEnv' und 'JavaVM'"