Unit testing 模拟domainInstance.validate()的返回值

Unit testing 模拟domainInstance.validate()的返回值,unit-testing,grails,mocking,spock,Unit Testing,Grails,Mocking,Spock,我正在编写一个测试控制器方法的单元测试 测试中的控制器操作实例化一个新的域实例对象,并 在保存之前对其调用validate。 是否存在模拟对domainInstance.validate()的调用的方法 能让它归还我想要的任何东西吗?还是我要把这个藏起来 实例化并保存在服务方法后面以实现这一点 我这样做是因为在 控制器,不应涉及域对象的约束。 我在其他地方测试这些(显然是在MyDomainClassTests中)。如果我 我想把这些考虑进去,我的测试将是一个集成 测试。如果您没有将验证放在域实例

我正在编写一个测试控制器方法的单元测试

测试中的控制器操作实例化一个新的域实例对象,并 在保存之前对其调用validate。 是否存在模拟对domainInstance.validate()的调用的方法 能让它归还我想要的任何东西吗?还是我要把这个藏起来 实例化并保存在服务方法后面以实现这一点

我这样做是因为在 控制器,不应涉及域对象的约束。 我在其他地方测试这些(显然是在MyDomainClassTests中)。如果我 我想把这些考虑进去,我的测试将是一个集成
测试。

如果您没有将验证放在域实例本身,而是放在服务中, 您可以让控制器在其构造函数中接受服务(或者更确切地说是服务的接口)。让该服务处理验证

现在,对于该控制器的单元测试,您需要将该接口(服务)的模拟传递给控制器,并配置该模拟以返回您想要的任何内容


对于.net,我可以推荐Moq()

过了一段时间,我得出结论,我想要的东西相当棘手。如果您所处的场景不必使用
mockDomain()
,则可以添加groovy元类方法及其实现(返回true或false,任意选择)


如果您确实需要mockDomain(),因为您需要模拟预先存在的实例,那么您就没有选择了,至少目前是这样,因为mockDomain()和摆弄mockDomain实际提供的元类方法不会混合使用。

是的,这是我在编写时建议的替代解决方案“或者我必须隐藏这个实例并保存在一个服务方法后面才能实现它吗?”问题是,我将绕过核心grails功能,有点违背框架的精神。对吧,我没有看到标记(或者我出于某种原因失明,或者你只是添加了它们——我希望以后会这样)如果你不能删除对验证的依赖性,你会被卡住。一些嘲弄框架可能会产生疑问——你尝试过TypeMock隔离器吗?(编辑:Type是.NET和C++的,但是我不知道GRAIL/java是否有类似的替代品?)对不起,佩尔,我认为标签已经在那里了:)无论如何,是的,groovy/grails有很多测试框架,我正在使用其中一个(Spock)我对它们没有太多的经验,过去几年我一直在Java/mockito阵营。顺便说一句,如果你能在这里添加'spock'标记,那就太好了。根据我的分数,我还不能添加不存在的标记:)