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

Xharness运行含Android Assets的xUnit单元测试时触发空引用异常

MAUI Android xUnit测试在xharness CI环境中访问Assets抛出空引用异常

问题详情

我有一个基于xUnit的MAUI Android单元测试应用,包含测试插桩(无头)和可视化两个入口,参考MAUI官方示例实现。该应用在Visual Studio中通过两种入口运行时,所有测试均正常通过,但使用xharness在CI环境运行时,所有调用AssetManager访问Android Assets的测试均失败,抛出空引用异常:

Object reference not set to an instance of an object

若在TestFixtures(IClassFixture)中访问Assets,会抛出聚合异常,内部仍是空引用异常:

Exception messages: System.AggregateException : AggregateException_ctor_DefaultMessage (Object reference not set to an instance of an object) (The following constructor parameters did not have matching fixture data: XXXX fixture)
System.NullReferenceException : Object reference not set to an instance of an object
The following constructor parameters did not have matching fixture data: TestColourClassificationFixture fixture   Exception stack traces: 
----- Inner Stack Trace #1 (System.NullReferenceException) -----

构建和运行命令如下:

dotnet build Android.Test.csproj -c Release -f net7.0-android
xharness android test --output-directory=test_results  --package-name=com.example.android.test --app=Android.Test/bin/Release/net7.0-android/com.example.android.test-Signed.apk --instrumentation=com.example.android.test.TestInstrumentation

已排查项

  • 确认APK包中包含Assets文件
  • 验证AssetManager实例不为空
  • 已禁用xUnit测试并行执行

可能的解决方案

1. 调整TestFixture的初始化时机

xharness通过Instrumentation启动测试时,IClassFixture的构造函数执行时机可能早于Android测试上下文的完全就绪——Visual Studio运行时的上下文初始化流程更快,而CI环境中xharness的启动流程可能存在延迟。

避免在Fixture构造函数中直接访问Assets,将资源访问逻辑移到测试方法内,或者改用xUnit的[Setup]方法(每个测试执行前触发)来初始化资源。如果必须在Fixture中处理,可延迟到第一次测试执行时再初始化Assets。

2. 显式使用Instrumentation上下文的AssetManager

不要直接依赖Android.App.Application.Context.Assets,而是通过测试专用的Instrumentation实例获取上下文:

var instrumentation = Android.App.InstrumentationRegistry.GetInstrumentation();
var assets = instrumentation.Context.Assets;
// 后续Assets操作

这种方式确保使用的是测试Instrumentation对应的上下文,而非应用的ApplicationContext,避免上下文未绑定导致的资源访问问题。

3. 检查Release构建的Assets配置

VS运行时可能默认使用Debug构建,而xharness调用的是Release构建,需确认:

  • Assets文件的Build Action是否设置为AndroidAsset
  • csproj文件中未意外排除Assets目录,确保包含类似配置:
    <ItemGroup>
      <AndroidAsset Include="Assets\**" />
    </ItemGroup>
    
  • 检查Release构建的混淆/裁剪规则,确保没有误删Assets相关的资源或类。

4. 验证Instrumentation参数正确性

确认xharness命令中--instrumentation指定的类正确,且该类继承自AndroidX.Test.Runner.AndroidJUnitRunner或MAUI测试专用的Instrumentation基类。如果Instrumentation类未正确初始化测试上下文,会导致资源访问失败。

5. 临时添加上下文就绪等待(Workaround)

如果以上方法无效,可在Fixture构造或Setup阶段添加短暂等待,确保Android上下文完全初始化:

public TestColourClassificationFixture()
{
    while (Android.App.Application.Context == null)
    {
        System.Threading.Thread.Sleep(100);
    }
    var assets = Android.App.Application.Context.Assets;
    // 后续逻辑
}

注意这只是临时解决方案,建议优先排查根本原因。

内容的提问来源于stack exchange,提问作者Antonio Lopes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:13:11