Skip to main content

移除 Android 上的 FlutterMain.setIsRunningInRobolectricTest

僅供測試用途的 FlutterMain.setIsRunningInRobolectricTest API 已在 Android 引擎中整合至 FlutterInjector。

摘要

#

如果你針對 Flutter 引擎的 Java 嵌入(embedding)進行 Java JUnit 測試(例如 Robolectric 測試),並且使用了 FlutterMain.setIsRunningInRobolectricTest(true) API, 請改用以下方式:

java
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
FlutterInjector.setInstance(
        new FlutterInjector.Builder()
            .setFlutterLoader(new FlutterLoader(mockFlutterJNI))
            .build());

這種情況應該非常罕見。

背景

#

FlutterMain 類別本身已經被棄用,並由 FlutterInjector 類別取代。FlutterMain 類別使用了許多靜態變數和函式,這使得測試變得困難。FlutterMain.setIsRunningInRobolectricTest() 是一種臨時的靜態機制,用來讓測試能在主機上的 JVM 執行,而不需要載入無法在主機上執行的 libflutter.so 原生函式庫。

為了避免這類一次性的解決方案,Flutter 在 Android/Java 引擎嵌入層中,所有測試所需的相依性注入(dependency injections)現在都已移至 FlutterInjector 類別。

FlutterInjector 類別中,setFlutterLoader() Builder 函式允許控制 FlutterLoader 類別如何定位與載入 libflutter.so 函式庫。

變更說明

#

這個 engine commit 移除了 FlutterMain.setIsRunningInRobolectricTest() 測試函式;而接下來的 commit 則新增了一個 FlutterInjector 類別來協助測試。PR 20473 進一步重構了 FlutterLoaderFlutterJNI,以便支援更多的 mock 與測試。

以支援更多的 mock/測試。

遷移指南

#

遷移前的程式碼:

java
FlutterMain.setIsRunningInRobolectricTest(true);

遷移後的程式碼:

java
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
FlutterInjector.setInstance(
        new FlutterInjector.Builder()
            .setFlutterLoader(new FlutterLoader(mockFlutterJNI))
            .build());

時程

#

合併於版本:1.22.0-2.0.pre.133
進入穩定版:2.0.0