2013-01-04 62 views
0

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

实际控制人有标有@ Reource-anotation

@Resource 私人服务业务的业务;

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

在控制器代码服务对象通常是用Spring的@Resource anotation.The问题intialized是当控制器在一些内部呼叫使用相同的服务,例如验证或内部类。

真实的验证还标有@ Reource-anotation

@Resource 私人服务业务的业务;

在测试I可以e.g介绍它的验证对象,设置服务并将它传递给控制器​​。

MyValidator validator = new MyValidator(); 
validator.setService(service); 
controller.setValidator(validator); 

假设验证器。验证调用service.getSomething。我需要为getSomething()编写Expectations;在控制器中也可以调用相同的方法。

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

     } 
    }); 

尽管允许基数的,这样的情况会导致

allowed, already invoked 1 time 

这是一个常见的场景,我无法提供更具体的代码。我想这与控制器和验证器服务方法调用有关。任何人都可以给我一个修改这个提示吗?

+0

对不起,但你的问题很难理解,说实话我不明白你的问题或情况。 – Ralph

+0

如何使用相同的mockobject控制器和控制器属性? – mjgirl

+0

我仍然认为你没有贬低你的问题:“问题是控制器在内部调用中使用相同的服务,例如验证器或内部类。” - 有一些东西缺失。 - 无论如何,我希望我理解你的权利,你想创造两个同班同学。我已发布了有关此主题的答案。 – Ralph

回答

0

如果您使用jMock,那么每一个模仿对象都有一个名字。这个名字必须是唯一的。

如果您使用的方法Mockery.mock(Class<T> typeToMock)然后名称将从类名来的。所以你可以用这种方法只为每个类创建一个模拟。

如果您需要在同一类的几个不同的嘲笑,然后用Mockery.mock(Class<T> typeToMock, String name)代替,并为每个模拟一个不同的名称。