模拟注入控制器的服务时,服务方法应返回模拟对象,如下所示:
public class EmptyInterventionServiceMock implements InterventionService {
@Override
public Intervention findByInvoiceNumber(String invoiceNumber, String language) {
return mockedIntervention(invoiceNumber, language);
}
protected Intervention mockedIntervention(String invoiceNumber, String language) {
return mock(Intervention.class);
}
}
是否可以模拟一些要由上述模拟对象(Intervention
)返回的值,以测试它们是否应出现在生成的JSON模板中?
例如,取决于Intervention
是否具有spare parts
,services
,states
(它们都是其他对象的集合),等等。如果是,则为JSON应该包含相应的键:services: [{....}]
,states: [{}]
等。
最好在测试中获得模拟对象并存根其返回值。我目前唯一实现此目的的方法是创建一个单独的Mock
服务类,并将其注入到测试类中,如下所示:
public class InterventionsControllerSpec extends ControllerSpec {
@Before
public void before() {
Injector injector = injector().bind(InterventionService.class).to(BaseInterventionServiceMock.class).create();
}
BaseInterventionServiceMock
仅扩展EmptyInterventionServiceMock
并在其中存根的某些方法通过覆盖其mockedIntervention
方法返回值:
public class BaseInterventionServiceMock extends EmptyInterventionServiceMock {
@Override
protected Intervention mockedIntervention(String invoiceNumber, String language) {
Intervention intervention = mock(Intervention.class);
when(intervention.getString("ITV_DOCUMENT_NUMBER")).thenReturn("123");
when(intervention.getString("ITV_INVOICE")).thenReturn(invoiceNumber);
...
etc.
由于距离理想还很远,我想知道是否有DRYer方式可以做到这一点?
谢谢。
答案 0 :(得分:0)
您什么都不丢失。您的假设是正确的。创建服务的模拟子类是我们进行测试的方式。如果您想以更优雅的方式,可以提交提案以供考虑:https://github.com/javalite/activeweb/issues以供考虑。