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

如何Mock对象测试依赖接口具体实现的方法?用Moq验证Eat调用

使用Moq验证IAnimal的Eat方法调用情况

问题场景

我有一个依赖接口具体类型的方法,想知道如何用Moq来验证.Eat()方法是否被调用。相关代码如下:

public interface IAnimal
{
    void Eat();
}

public class Dog: IAnimal
{
    public void Eat(){}
}

void EatIfNoDogsInGroup(IList<IAnimal> animals)
{
    if (animals.All(a => a is not Dog))
    {
        foreach (var animal in animals)
            animal.Eat();
    }
}

测试方案

场景1:动物组中没有Dog,验证Eat方法被调用

你可以创建Moq的IAnimal模拟实例,将它们加入不含Dog的列表,调用目标方法后,验证每个模拟对象的Eat方法是否被调用了一次:

[Test]
public void EatIfNoDogsInGroup_WhenNoDogs_EachAnimalEats()
{
    // 创建两个IAnimal的模拟对象
    var animal1 = new Mock<IAnimal>();
    var animal2 = new Mock<IAnimal>();
    var animals = new List<IAnimal> { animal1.Object, animal2.Object };

    // 执行要测试的方法
    EatIfNoDogsInGroup(animals);

    // 验证每个模拟对象的Eat方法都被调用了一次
    animal1.Verify(a => a.Eat(), Times.Once);
    animal2.Verify(a => a.Eat(), Times.Once);
}

场景2:动物组中有Dog,验证Eat方法未被调用

当列表里包含Dog实例时,目标方法不会触发Eat调用,此时要验证模拟对象的Eat方法从未被执行:

[Test]
public void EatIfNoDogsInGroup_WhenHasDog_NoAnimalEats()
{
    // 创建模拟对象和真实的Dog实例
    var animal1 = new Mock<IAnimal>();
    var dog = new Dog();
    var animals = new List<IAnimal> { animal1.Object, dog };

    // 执行要测试的方法
    EatIfNoDogsInGroup(animals);

    // 验证模拟对象的Eat方法从未被调用
    animal1.Verify(a => a.Eat(), Times.Never);
}

核心要点

  • 用Mock<IAnimal>生成接口的模拟实例,Moq会自动跟踪这些实例的方法调用记录。
  • Verify方法是Moq验证调用的核心,Times.Once/Times.Never用来指定预期的调用次数,还可以用Times.Exactly(n)设置精确次数。
  • 测试时要覆盖方法的两个分支逻辑(有Dog/无Dog),确保业务逻辑的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:16:06