【问题标题】:Jmock, Spring and anotated resources in testing测试中的 Jmock、Spring 和带注释的资源
【发布时间】:2013-01-04 07:51:17
【问题描述】:

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

真正的控制器有一个用@Reource-annotation 标记的服务

@资源 私人服务服务;

测试 最终服务 service = context.mock(Service.class); 控制器.setService(服务); 控制器.CallMethodToTest();

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

真正的验证器也有一个用@Reource-annotation 标记的服务

@资源 私人服务服务;

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

 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

这是一种常见情况,我无法提供更具体的代码。我想这与控制器和验证器服务方法调用有关。谁能给我一个解决这个问题的提示?

【问题讨论】:

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

标签: spring unit-testing testing jmock


【解决方案1】:

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

如果您使用Mockery.mock(Class<T> typeToMock) 方法,那么名称将派生自类名。所以你只能用这个方法为每个类创建一个 mock。

如果您需要同一类的多个不同模拟,请改用Mockery.mock(Class<T> typeToMock, String name),并为每个模拟指定不同的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多