首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveWeb:模拟注入服务

ActiveWeb:模拟注入服务
EN

Stack Overflow用户
提问于 2018-09-27 21:51:25
回答 1查看 9关注 0票数 0

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

代码语言:javascript
复制
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服务类,并将其注入到测试类中,如下所示:

代码语言:javascript
复制
public class InterventionsControllerSpec extends ControllerSpec {

    @Before
    public void before() {
        Injector injector = injector().bind(InterventionService.class).to(BaseInterventionServiceMock.class).create();
    }

BaseInterventionServiceMock只扩展EmptyInterventionServiceMock和存根的地方,一些方法通过覆盖它的mockedIntervention方法来返回值:

代码语言:javascript
复制
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方法可以做到这一点?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-09-27 23:54:12

你不会错过任何东西。你的假设是正确的。创建服务的mock子类是我们进行测试的方式。如果你想要一种更优雅的方式,你可以提交一个建议供考虑:https://github.com/javalite/activeweb/issues供考虑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52538647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档