我用Jmock为Spring编写控制器测试。控制器使用接口进行数据库操作。这些是服务类。我可以通过setter将它们jmock并传递给控制器。
Real controller的服务标有@ Reource-anotation
@Resource 私人服务;
测试 final Service service = context.mock(Service.class); controller.setService(服务); controller.CallMethodToTest();
在控制器代码中,服务对象通常使用Spring的@Resource anotation初始化。问题是控制器在某些内部调用中使用相同的服务,例如验证器或内部类。
Real validator也有一个标有@ Reource-anotation
的服务@Resource 私人服务;
在测试中,我可以引入验证器对象,在其上设置服务并将其传递给控制器。
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
这是常见的情况,我无法提供更具体的代码。我想这与控制器和验证器服务方法调用有关。任何人都可以给我一个解决这个问题的提示吗?
答案 0 :(得分:0)
如果使用JMock,则每个模拟对象都有一个名称。这个名字必须是唯一的。
如果您使用方法Mockery.mock(Class<T> typeToMock)
,则名称将从类名派生。因此,您只能使用此方法为每个类创建一个模拟。
如果你需要同一个类的几个不同的模拟,那么请改用Mockery.mock(Class<T> typeToMock, String name)
,并给每个模拟一个不同的名称。