Android Studio中如何调用类内函数并测试Firestore写入功能?
问题描述
在Android Studio开发项目时,无法调用同一文件中MyDataBase类的test()函数来写入Firebase Firestore数据库,运行程序时报错。同时希望了解如何单独测试该函数的Firestore数据写入功能,无需完整运行整个应用。
提供的代码如下:
package com.example.myapplication import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.FirebaseFirestore class MyDataBase { lateinit var db: DocumentReference var isStudent = true fun initializeDbRef() { db = FirebaseFirestore.getInstance().document("Users") } fun writeNewUser(email: String, pass: String) { val items = HashMap<String, Any>() items.put("Password", pass) db.collection("Students").document("wIPzm1J5zZtVPksa1J8z").set(items) } fun test(name: String, email: String) { val database = FirebaseFirestore.getInstance() val myRef = database.collection("Users") val newUser = hashMapOf( "name" to name, "email" to email ) myRef.add(newUser) } } fun main() { val myObject = MyDataBase() val result = myObject.test("maks", "email.com") }
尝试添加了main函数运行,但问题仍存在。
问题解决与测试方案
一、解决当前函数调用报错问题
- Android环境不能直接用main函数启动
Android应用依赖Android框架的上下文环境,直接写main函数无法初始化Firebase所需的依赖和配置,这是报错的核心原因。正确做法是在Android组件(如Activity、Fragment)中实例化类并调用函数:
// 在Activity中调用示例 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val dbHelper = MyDataBase() dbHelper.test("maks", "test@example.com") } }
- 检查Firebase基础配置
确保项目已正确对接Firebase:
- 根目录已添加
google-services.json文件 - app模块的
build.gradle中引入Firestore依赖:
implementation 'com.google.firebase:firebase-firestore-ktx:24.10.0' // 版本以官方最新为准
- Firebase控制台已启用Firestore数据库,测试阶段可临时设置宽松安全规则(上线前需修改):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
二、单独测试Firestore写入函数的方案
方案1:Android单元测试(依赖本地模拟器)
- 在
app/src/test/java/com/example/myapplication下创建测试类:
import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.LooperMode @RunWith(RobolectricTestRunner::class) @LooperMode(LooperMode.Mode.PAUSED) class MyDatabaseTest { @Test fun testFirestoreWrite() { val db = Firebase.firestore val myRef = db.collection("Users") val newUser = hashMapOf( "name" to "testName", "email" to "test@example.com" ) // 同步等待写入结果 val task = myRef.add(newUser) task.addOnCompleteListener { if (it.isSuccessful) { println("数据写入成功,文档ID:${it.result?.id}") } else { println("写入失败:${it.exception?.message}") } } Thread.sleep(3000) } }
- 在
build.gradle添加测试依赖:
testImplementation 'org.robolectric:robolectric:4.12.1' testImplementation 'junit:junit:4.13.2' testImplementation 'com.google.firebase:firebase-firestore-ktx:24.10.0'
运行该测试用例即可单独验证写入逻辑。
方案2:Firebase本地模拟器测试
- 启动Firestore本地模拟器(Android Studio顶部菜单栏:Tools > Firebase > Firestore > 运行本地模拟器)
- 修改测试代码连接到本地模拟器,避免污染线上数据:
import org.junit.Before // ...其他导入 class MyDatabaseTest { @Before fun setup() { val db = Firebase.firestore db.useEmulator("10.0.2.2", 8080) // Android模拟器访问本地服务的固定地址 } // ...testFirestoreWrite函数不变 }
方案3:独立Kotlin控制台项目测试
如果不想依赖Android环境,可单独创建Kotlin/JVM项目:
- 新建Kotlin控制台项目
- 添加Firebase Admin SDK依赖:
implementation 'com.google.firebase:firebase-admin:9.2.0'
- 从Firebase控制台下载服务账号密钥(JSON文件),放在项目根目录
- 编写测试代码:
import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseOptions import com.google.firebase.firestore.FirebaseFirestore import java.io.FileInputStream fun main() { val options = FirebaseOptions.builder() .setCredentials(com.google.firebase.auth.FirebaseCredentials.fromStream(FileInputStream("service-account-key.json"))) .setDatabaseUrl("https://你的项目ID.firebaseio.com") .build() FirebaseApp.initializeApp(options) val db = FirebaseFirestore.getInstance() val myRef = db.collection("Users") val newUser = hashMapOf( "name" to "maks", "email" to "email.com" ) myRef.add(newUser).addOnCompleteListener { if (it.isSuccessful) { println("写入成功") } else { println("失败:${it.exception?.message}") } } Thread.sleep(5000) }
运行该main函数即可直接测试Firestore写入功能。
内容的提问来源于stack exchange,提问作者real4you
相关产品推荐
相关产品推荐

