ActiveWeb:模拟注入服务

时间:2018-09-27 13:51:25

标签: activeweb

模拟注入控制器的服务时,服务方法应返回模拟对象,如下所示:

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 partsservicesstates(它们都是其他对象的集合),等等。如果是,则为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方式可以做到这一点?

谢谢。

1 个答案:

答案 0 :(得分:0)

您什么都不丢失。您的假设是正确的。创建服务的模拟子类是我们进行测试的方式。如果您想以更优雅的方式,可以提交提案以供考虑:https://github.com/javalite/activeweb/issues以供考虑。