Unit testing 对于我来说,要使用Moq,我的所有类都必须实现一个接口吗?

Unit testing 对于我来说,要使用Moq,我的所有类都必须实现一个接口吗?,unit-testing,nhibernate,nunit,moq,Unit Testing,Nhibernate,Nunit,Moq,我想使用Moq,但我使用的是Nhibernate,我没有为所有模型类(POCO类)创建接口 我是否必须为每个类创建一个接口才能moq我的POCO类?您正在模拟的类/方法要么需要实现接口,要么是虚拟的。只要类/方法是可访问的,您就可以对其进行测试,但无法模拟无法显式重写或实现的对象。您可以模拟虚拟方法,但最好是使用接口 我这样说的理由如下: var mockObject = new Mock<IMyObject>(); var mockObject=new Mock(); 如果使用

我想使用Moq,但我使用的是Nhibernate,我没有为所有模型类(POCO类)创建接口


我是否必须为每个类创建一个接口才能moq我的POCO类?

您正在模拟的类/方法要么需要实现接口,要么是虚拟的。只要类/方法是可访问的,您就可以对其进行测试,但无法模拟无法显式重写或实现的对象。

您可以模拟虚拟方法,但最好是使用接口

我这样说的理由如下:

var mockObject = new Mock<IMyObject>();
var mockObject=new Mock();
如果使用虚拟方法,它将变为:

var mockObject = new Mock<MyObject>(params...);
var mockObject=new Mock(参数…);
您被迫包含具体对象的参数,但显然不需要包含接口的参数。如果您决定在以后更改类的构造函数,则所有使用具体类的测试都需要更新。我在过去已经被这个烧坏了,所以不要再使用虚拟方法进行测试了

我应该补充一点,通过尝试模拟具体类型,您正在挫败模拟框架的目的。你应该是。因此,在这种情况下,开发一个抽象接口是一件很好的事情


另一个原因是接口是如何工作的,接口是一个契约,而不是行为。当您有多个实现时,应该使用它们,并且我将类测试作为一种行为,因此是引入新接口的有效理由。

您刚刚问过这个问题。不要重复,如果可以的话,我建议你结束/删除你的其他问题。这里的答案就是你想要的。没有必要重复它们。让我们结束他的另一个问题,而不是结束这个问题-这似乎更清楚,可能对其他人有价值。你为什么要嘲笑一个POCO类?只要用必要的值创建一个实例。@Frank说得很好。你不应该嘲笑POCO。服务-是的,实体(可能在某些情况下),但肯定不是DTO/POCOs/POJO等。我同意支持接口。不过,在一些情况下,抽象类更有意义(例如模板方法模式)。像往常一样,这些都是指导原则——使用你自己的判断。