gpt4 book ai didi

unit-testing - 如何编写模拟对象?

转载 作者:行者123 更新时间:2023-12-01 09:11:39 24 4
gpt4 key购买 nike

我的第一份编程工作向我介绍了单元测试和模拟对象的概念,但总觉得有些不对劲。

假设我们正在编写一个银行应用程序,并且需要模拟一个 BankAccount 对象:


// boilerplate code
public interface IBankAccount {
void Deposit(int amount);
void Withdrawal(int amount);
int getBalance();
int getAccountNumber();
}

public interface IBankAccountFactory {
IBankAccount getAccount(int accountNumber);
}

public class ProductionBankAccountFactory implements IBankAccountFactory {
public IBankAccount getAccount(int accountNumber) {
return new RealBankAccount(accountNumber);
}
}

public class MockBankAccountFactory implements IBankAccountFactory {
public IBankAccount getAccount(int accountNumber) {
return new MockBankAccount(accountNumber);
}
}

public static class BankAccountFactory {
// ewww, singletons!
public static IBankAccountFactory Instance;
}

// finally, my actual business objects
public class MockBankAccount implements IBankAccount {
public MockBankAccount(int accountNumber) { ... }
// interface implementation
}

public class RealBankAccount implements IBankAccount {
public RealBankAccount(int accountNumber) { ... }
// interface implementation
}

每个类(class)都有一个目的:

  • 工厂和工厂接口(interface)的存在是为了将构造函数封装到我们的模拟对象和真实对象中。
  • 静态 BankAccountFactory 类允许我们在生产应用或测试开始时分别为 BankAccountFactory.Instance 分配一个 IRealBankAccountFactory 或 MockBankAccountFactory 的实例。
  • 一旦一切设置妥当,任何类都可以通过调用来获取 IBankAccount 的实例:

BankAccountFactory.Instance.getAccount(accountNum);

这可行,但会导致大量样板代码。我不应该为每个要模拟的类编写 5 个新类。我确信有一种更简单的方法,所以我不得不询问 SO 社区:

是否有更好或首选的方式来编写模拟对象?

[编辑添加:] 我很欣赏到模拟和 DI 框架的链接,但现在我正在开发一个 500 KLOC 的应用程序,并且至少 60% 的代码由上述风格的样板模拟类。

我只是想减少代码库的大小,而不需要为 Yet-Another-Framework™ 重写大量代码,所以它可以帮助我更多地看到手工编写的模拟类。 :)

最佳答案

更好的方法是让别人来写。这里的一些选项是:

起订量 - http://code.google.com/p/moq/

犀牛模拟 - http://ayende.com/projects/rhino-mocks.aspx

关于unit-testing - 如何编写模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/447516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com