如何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
相关产品推荐
相关产品推荐

