模拟接口vs模拟类
本文关键字:模拟类 vs 接口 模拟 | 更新日期: 2023-09-27 18:04:15
需要一点建议…我是模拟东西的新手,正在编写一些最小起订量测试……我遇到了一个需要测试的界面:
假设我有这样一个接口:
interface IAWClient
{
void Login( string );
}
我是这样写我的最小起订量测试的
最小起订量测试1:
[Test]
public void LoginTest()
{
Mock<IAWClient> m = new Mock<IAWClient>();
m.Setup(x => x.Login("Joe"));
m.Object.Login("Joe"); <<-- this is the line I am interested in
}
但是我见过许多使用具体类来测试接口的例子…例如:
public class AdmissionMngr
{
IAWClient m_IAWClient;
public AdmissionMngr( IAWClient iaw )
{
m_IAWClient = iaw;
}
public void Admit(string name)
{
m_IAWClient.Login(name);
}
}
使用像这样的模拟测试:
最小起订量测试2:
[Test]
public void LoginTest()
{
Mock<IAWClient> m = new Mock<IAWClient>();
m.Setup(x => x.Login("Joe"));
AdmissionMngr admin = new AdmissionMngr(m.Object);
admin.Admit("Joe"); <<-- this is the line I am interested in
}
对于指示的两行…最少起订量测试1和最少起订量测试2是否相等?为什么或者为什么不呢?
这就是依赖注入的样子。您正在测试AdmissionMngr
,但为了确保您不测试由该管理器使用的IAWClient
,您创建模拟IAWClient
实现(使用mock框架)并将其作为依赖传递给对象构造函数。
关于你发布的代码:
第一个实际上是测试模拟对象,所以在我看来它是没有意义的。第二个测试是模拟AdmissionMngr
的依赖,这在单元测试中是很常见的做法。
您的模拟将被注入到其他测试用例中。你不测试你的模拟…它们总是会生成你让它们生成的东西(你的第一个例子就是这样做的)。
当你嘲笑某事时-它没有被测试。您可以使用mock来测试需要该类型对象才能运行的其他内容。您可以让它提供一些预期的输入,但是另一个对象应该基于它产生一些预期的输出。
所以,你的第二个例子是正确的。