测试中的Jmock、Spring和anotated资源

测试中的Jmock、Spring和anotated资源,spring,unit-testing,testing,jmock,Spring,Unit Testing,Testing,Jmock,我用Jmock为Spring编写控制器测试。控制器使用接口进行数据库操作。这些是服务类。我可以jmock它们,并通过setter将它们传递给测试中的控制器 Real controller有一个标有@Reource anotion的服务 @资源 私人服务 试验 最终服务=context.mock(Service.class); 控制器。设置服务(服务); controller.CallMethodToTest() 在控制器代码中,服务对象通常使用Spring的@Resource Anotion初始

我用Jmock为Spring编写控制器测试。控制器使用接口进行数据库操作。这些是服务类。我可以jmock它们,并通过setter将它们传递给测试中的控制器

Real controller有一个标有@Reource anotion的服务

@资源 私人服务

试验 最终服务=context.mock(Service.class); 控制器。设置服务(服务); controller.CallMethodToTest()

在控制器代码中,服务对象通常使用Spring的@Resource Anotion初始化。问题是当控制器在某些内部调用中使用相同的服务时,例如验证程序或内部类

RealValidator还有一个标有@Reource anotion的服务

@资源 私人服务

在测试中,我可以引入验证器对象,在其上设置服务并将其传递给控制器

 MyValidator validator = new MyValidator();
 validator.setService(service);
 controller.setValidator(validator);
比如验证器。验证调用service.getSomething。我需要为getSomething()编写期望值;在控制器中,也可以调用相同的方法

        context.checking(new Expectations() {
        {
            allowing(service).getSomething();
            will(returnValue(mockData));

        }
    });
尽管允许基数,但这样的情况会导致

 allowed, already invoked 1 time

这是一个常见的场景,我无法提供更具体的代码。我猜这与控制器和验证器服务方法调用都有关系。有谁能给我一个关于修复此问题的提示吗?

如果使用JMock,那么每个模拟对象都有一个名称。此名称必须是唯一的

如果使用方法
mockry.mock(Class-typeToMock)
,则名称将从类名派生。因此,使用此方法只能为每个类创建一个模拟


如果您需要同一类的多个不同mock,请使用
mockry.mock(class-typeToMock,String-name)
,并为每个mock指定不同的名称。

对不起,您的问题很难理解,老实说,我不理解您的问题或场景。控制器和控制器属性使用相同的mockobject如何?我仍然认为您没有描述您的问题:“问题是控制器在某些内部调用中使用相同的服务,例如验证程序或内部类。”--缺少一些东西。-无论如何,我希望我理解你的权利,你想创建两个相同类的模拟。我已经发布了这个主题的答案。