You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数运行,但问题仍存在。


问题解决与测试方案

一、解决当前函数调用报错问题

  1. 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")
    }
}
  1. 检查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单元测试(依赖本地模拟器)

  1. 在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)
    }
}
  1. 在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本地模拟器测试

  1. 启动Firestore本地模拟器(Android Studio顶部菜单栏:Tools > Firebase > Firestore > 运行本地模拟器)
  2. 修改测试代码连接到本地模拟器,避免污染线上数据:
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项目:

  1. 新建Kotlin控制台项目
  2. 添加Firebase Admin SDK依赖:
implementation 'com.google.firebase:firebase-admin:9.2.0'
  1. 从Firebase控制台下载服务账号密钥(JSON文件),放在项目根目录
  2. 编写测试代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:20:17