unit-testing - 硬编码模拟对象与模拟框架

标签 unit-testing testing mocking

我很好奇人们喜欢使用什么方法进行模拟以及为什么。我知道的两种方法是使用硬编码模拟对象和模拟框架。为了进行演示,我将概述一个使用 C# 的示例。

假设我们有一个 IEmployeeRepository 接口(interface)和一个名为 GetEmployeeById 的方法。

public interface IEmployeeRepository
{
    Employee GetEmployeeById(long id);
}

我们可以很容易地创建一个模拟:

public class MockEmployeeRepository : IEmployeeRepository
{
    public Employee GetEmployeeById(long id)
    {
        Employee employee = new Employee();
        employee.FirstName = "First";
        employee.LastName = "Last";
        ...
        return employee;
    }
}

然后,在我们的测试中,我们可以明确地告诉我们的服务使用 MockEmployeeRepository,使用 setter 或依赖注入(inject)。我是模拟框架的新手,所以我很好奇我们为什么要使用它们,如果我们可以做到以上几点?

最佳答案

那不是模拟,而是 stub 。对于 stub ,您的示例是完全可以接受的。

来自马丁·福勒:

Mocks 是我们在这里谈论的内容:预编程的对象形成了预期接收的调用规范。

当您模拟某些东西时,您通常会调用“验证”方法。

看看这个模拟和 stub 之间的区别 http://martinfowler.com/articles/mocksArentStubs.html

关于unit-testing - 硬编码模拟对象与模拟框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4370617/

相关文章:

javascript - Jasmine toThrowError 失败,消息 "Error: Actual is not a function"

python - 如何测试 Flask 开发服务器是否已启动?

python - Selenium 无法选择 iframe 的上下文(间歇性地)

c# - MVC4/Mocking Controller.Request

ruby - 有没有办法在 Test::Unit 中撤消 any_instance 的摩卡 stub

c# - 对跟踪状态的类进行单元测试

javascript - sinon - CallsArg 与高级用法

ruby-on-rails - 使用事件管理员进行 Rails 测试

Angular Testing : How to provide configuration object to service class with TestBed?

.net - 如何在 NSubstitute 中使用私有(private) setter 模拟对象的索引器?