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

Mapster映射器:如何对配置进行单元测试?

如何对Mapster映射配置进行单元测试

1. 测试基础映射结果

最直接的方式是创建测试实例,执行映射后验证目标对象的属性是否符合预期。

假设我们有以下类:

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class UserDto
{
    public int Id { get; set; }
    public string FullName { get; set; }
}

对应的映射配置:

TypeAdapterConfig<User, UserDto>.NewConfig()
    .Map(dest => dest.FullName, src => $"{src.FirstName} {src.LastName}");

使用xUnit编写单元测试:

[Fact]
public void User_To_UserDto_Maps_All_Properties_Correctly()
{
    // 准备测试数据
    var user = new User { Id = 1, FirstName = "Jane", LastName = "Smith" };
    
    // 执行映射
    var dto = user.Adapt<UserDto>();
    
    // 验证结果
    Assert.Equal(user.Id, dto.Id);
    Assert.Equal($"{user.FirstName} {user.LastName}", dto.FullName);
}

2. 验证映射配置的有效性

Mapster内置了Validate()方法,可以检查配置是否存在语法错误、类型不匹配等问题,一旦有无效配置会直接抛出异常,让测试失败。

验证全局配置

[Fact]
public void Mapster_Global_Configuration_Is_Valid()
{
    // 验证所有已注册的映射配置
    TypeAdapterConfig.GlobalSettings.Validate();
}

验证特定映射配置

[Fact]
public void User_To_UserDto_Configuration_Is_Valid()
{
    TypeAdapterConfig<User, UserDto>.Config.Validate();
}

3. 检查未映射属性(避免遗漏)

如果要确保源类和目标类的所有属性都被正确映射,可以通过Mapster的API检测未映射的属性,或者在配置阶段强制禁止未映射。

方式一:强制禁止未映射

在全局配置中设置不允许未映射属性,这样Validate()时会直接报错:

// 全局配置(可放在启动逻辑中)
TypeAdapterConfig.GlobalSettings.Default
    .IgnoreUnmapped(false); // 关闭"忽略未映射属性"的默认行为

然后执行验证测试,一旦有未映射的属性,测试会失败。

方式二:手动检测未映射属性

[Fact]
public void User_To_UserDto_Has_No_Unmapped_Properties()
{
    var config = TypeAdapterConfig<User, UserDto>.Config;
    var unmapped = config.GetUnmappedProperties();
    
    // 断言源类和目标类都没有未映射的属性
    Assert.Empty(unmapped.SourceProperties);
    Assert.Empty(unmapped.DestinationProperties);
}

4. 测试自定义映射逻辑

如果使用了自定义转换器、解析器或映射规则,需要单独测试这些逻辑的正确性。

比如自定义日期字符串解析器:

public class CustomDateParser : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        config.NewConfig<string, DateTime>()
            .MapWith(src => DateTime.ParseExact(src, "yyyy-MM-dd", CultureInfo.InvariantCulture));
    }
}

测试这个解析器:

[Fact]
public void Custom_Date_Parser_Converts_String_Correctly()
{
    var dateStr = "2024-06-15";
    var result = dateStr.Adapt<DateTime>();
    
    Assert.Equal(new DateTime(2024, 6, 15), result);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:30:48