diff --git a/JniInvocation.cpp b/JniInvocation.cpp
index 031dcb3..51cba6d 100644
--- a/JniInvocation.cpp
+++ b/JniInvocation.cpp
@@ -29,6 +29,28 @@
 #include <sys/system_properties.h>
 #endif
 
+template <typename T>
+void UNUSED(const T&) {}
+
+bool IsDebuggable() {
+#ifdef __ANDROID__
+  char debuggable[PROP_VALUE_MAX] = {0};
+  __system_property_get("ro.debuggable", debuggable);
+  return strcmp(debuggable, "1") == 0;
+#else
+  return false;
+#endif
+}
+
+int GetLibrarySystemProperty(char* buffer) {
+#ifdef __ANDROID__
+  return __system_property_get("persist.sys.dalvik.vm.lib.2", buffer);
+#else
+  UNUSED(buffer);
+  return 0;
+#endif
+}
+
 JniInvocation* JniInvocation::jni_invocation_ = NULL;
 
 JniInvocation::JniInvocation() :
@@ -48,22 +70,18 @@
   }
 }
 
-#ifdef __ANDROID__
-static const char* kLibrarySystemProperty = "persist.sys.dalvik.vm.lib.2";
-static const char* kDebuggableSystemProperty = "ro.debuggable";
-#endif
 static const char* kLibraryFallback = "libart.so";
 
-template<typename T> void UNUSED(const T&) {}
-
 const char* JniInvocation::GetLibrary(const char* library, char* buffer) {
+  return GetLibrary(library, buffer, &IsDebuggable, &GetLibrarySystemProperty);
+}
+
+const char* JniInvocation::GetLibrary(const char* library, char* buffer, bool (*is_debuggable)(),
+                                      int (*get_library_system_property)(char* buffer)) {
 #ifdef __ANDROID__
   const char* default_library;
 
-  char debuggable[PROP_VALUE_MAX];
-  __system_property_get(kDebuggableSystemProperty, debuggable);
-
-  if (strcmp(debuggable, "1") != 0) {
+  if (!is_debuggable()) {
     // Not a debuggable build.
     // Do not allow arbitrary library. Ignore the library parameter. This
     // will also ignore the default library, but initialize to fallback
@@ -75,7 +93,7 @@
     // Accept the library parameter. For the case it is NULL, load the default
     // library from the system property.
     if (buffer != NULL) {
-      if (__system_property_get(kLibrarySystemProperty, buffer) > 0) {
+      if (get_library_system_property(buffer) > 0) {
         default_library = buffer;
       } else {
         default_library = kLibraryFallback;
@@ -87,6 +105,8 @@
   }
 #else
   UNUSED(buffer);
+  UNUSED(is_debuggable);
+  UNUSED(get_library_system_property);
   const char* default_library = kLibraryFallback;
 #endif
   if (library == NULL) {
diff --git a/include/nativehelper/JniInvocation.h b/include/nativehelper/JniInvocation.h
index fc2ed0a..58beec5 100644
--- a/include/nativehelper/JniInvocation.h
+++ b/include/nativehelper/JniInvocation.h
@@ -45,6 +45,8 @@
   static const char* GetLibrary(const char* library, char* buffer);
 
  private:
+  static const char* GetLibrary(const char* library, char* buffer, bool (*is_debuggable)(),
+                                int (*get_library_system_property)(char* buffer));
 
   bool FindSymbol(void** pointer, const char* symbol);
 
@@ -64,6 +66,8 @@
   friend jint JNI_GetDefaultJavaVMInitArgs(void* vm_args);
   friend jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args);
   friend jint JNI_GetCreatedJavaVMs(JavaVM** vms, jsize size, jsize* vm_count);
+  friend class JNIInvocation_Debuggable_Test;
+  friend class JNIInvocation_NonDebuggable_Test;
 };
 
 #endif  // JNI_INVOCATION_H_included
diff --git a/tests/JniInvocation_test.cpp b/tests/JniInvocation_test.cpp
index 1467cb3..bb62e39 100644
--- a/tests/JniInvocation_test.cpp
+++ b/tests/JniInvocation_test.cpp
@@ -33,80 +33,33 @@
 // PROPERTY_VALUE_MAX.
 #include "cutils/properties.h"
 
-// Ability to have fake local system properties.
-#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
-#include <sys/_system_properties.h>
-
-struct LocalPropertyTestState {
-    LocalPropertyTestState() : valid(false) {
-        const char* ANDROID_DATA = getenv("ANDROID_DATA");
-        char dir_template[PATH_MAX];
-        snprintf(dir_template, sizeof(dir_template), "%s/local/tmp/prop-XXXXXX", ANDROID_DATA);
-        char* dirname = mkdtemp(dir_template);
-        if (!dirname) {
-            fprintf(stderr, "making temp file for test state failed (is %s writable?): %s",
-                    dir_template, strerror(errno));
-            return;
-        }
-
-        pa_dirname = dirname;
-        pa_filename = pa_dirname + "/__properties__";
-
-        __system_property_set_filename(pa_filename.c_str());
-        __system_property_area_init();
-        valid = true;
-    }
-
-    ~LocalPropertyTestState() {
-        if (!valid) {
-            return;
-        }
-
-        __system_property_set_filename(PROP_FILENAME);
-        __system_properties_init();
-        unlink(pa_filename.c_str());
-        rmdir(pa_dirname.c_str());
-    }
-public:
-    bool valid;
-private:
-    std::string pa_dirname;
-    std::string pa_filename;
-};
 #endif
 
-namespace android {
-
-class JNIInvocationTest : public testing::Test {
-};
-
 #ifdef HAVE_TEST_STUFF
-static const char* kDebuggableSystemProperty = "ro.debuggable";
-static const char* kIsDebuggableValue = "1";
-static const char* kIsNotDebuggableValue = "0";
-
-static const char* kLibrarySystemProperty = "persist.sys.dalvik.vm.lib.2";
 static const char* kTestNonNull = "libartd.so";
 static const char* kTestNonNull2 = "libartd2.so";
 static const char* kExpected = "libart.so";
 #endif
 
-TEST_F(JNIInvocationTest, Debuggable) {
+TEST(JNIInvocation, Debuggable) {
 #ifdef HAVE_TEST_STUFF
-    LocalPropertyTestState pa;
-    ASSERT_TRUE(pa.valid);
-    ASSERT_EQ(0, __system_property_add(kDebuggableSystemProperty, 13, kIsDebuggableValue, 1));
-    ASSERT_EQ(0, __system_property_add(kLibrarySystemProperty, 27, kTestNonNull2, 11));
+    auto is_debuggable = []() { return true; };
+    auto get_library_system_property = [](char* buffer) -> int {
+        strcpy(buffer, kTestNonNull2);
+        return sizeof(kTestNonNull2);
+    };
 
     char buffer[PROPERTY_VALUE_MAX];
-    const char* result = JniInvocation::GetLibrary(NULL, buffer);
+    const char* result =
+        JniInvocation::GetLibrary(NULL, buffer, is_debuggable, get_library_system_property);
     EXPECT_FALSE(result == NULL);
     if (result != NULL) {
         EXPECT_TRUE(strcmp(result, kTestNonNull2) == 0);
         EXPECT_FALSE(strcmp(result, kExpected) == 0);
     }
 
-    result = JniInvocation::GetLibrary(kTestNonNull, buffer);
+    result =
+        JniInvocation::GetLibrary(kTestNonNull, buffer, is_debuggable, get_library_system_property);
     EXPECT_FALSE(result == NULL);
     if (result != NULL) {
         EXPECT_TRUE(strcmp(result, kTestNonNull) == 0);
@@ -117,14 +70,12 @@
 #endif
 }
 
-TEST_F(JNIInvocationTest, NonDebuggable) {
+TEST(JNIInvocation, NonDebuggable) {
 #ifdef HAVE_TEST_STUFF
-    LocalPropertyTestState pa;
-    ASSERT_TRUE(pa.valid);
-    ASSERT_EQ(0, __system_property_add(kDebuggableSystemProperty, 13, kIsNotDebuggableValue, 1));
+    auto is_debuggable = []() { return false; };
 
     char buffer[PROPERTY_VALUE_MAX];
-    const char* result = JniInvocation::GetLibrary(NULL, buffer);
+    const char* result = JniInvocation::GetLibrary(NULL, buffer, is_debuggable, nullptr);
     EXPECT_FALSE(result == NULL);
     if (result != NULL) {
         EXPECT_TRUE(strcmp(result, kExpected) == 0);
@@ -132,7 +83,7 @@
         EXPECT_FALSE(strcmp(result, kTestNonNull2) == 0);
     }
 
-    result = JniInvocation::GetLibrary(kTestNonNull, buffer);
+    result = JniInvocation::GetLibrary(kTestNonNull, buffer, is_debuggable, nullptr);
     EXPECT_FALSE(result == NULL);
     if (result != NULL) {
         EXPECT_TRUE(strcmp(result, kExpected) == 0);
@@ -142,5 +93,3 @@
     GTEST_LOG_(WARNING) << "Host testing unsupported. Please run target tests.";
 #endif
 }
-
-}  // namespace android
