繁体   English   中英

如何在基于代理的Spring bean中设置模拟对象?

[英]How to set mock object in proxy-based Spring bean?

我在尝试在测试用例的有线bean中设置模拟对象时遇到问题。

这是我的简化问题:

class SomeClassTest {
    @Autowired
    private SomeClass   someClass;

    @Test
    public void testRun() {
        Service service = mock(ServiceImpl.class);
        when(service.doIt()).thenReturn("");

        // this line fails with ClassCastException
        ((SomeClassImpl) someClass).setService(service);

        assertEquals("bad", someClass.run());
    }
}

interface SomeClass {
    String run();
}

class SomeClassImpl implements SomeClass {
    private Service service;

    public void setService(Service service) {
        this.service = service;
    }

    public String run() {
        String value = service.doIt();
        return StringUtils.isBlank(value) ? "bad" : "good";
    }
}

interface Service {
    String doIt();
}

class ServiceImpl implements Service {
    public String doIt() {
        return "bla";
    }
}

在此示例中,我试图通过模拟Service.doIt()来测试SomeClass ,以便可以测试不同的条件。 我面临的问题是我不确定我应该如何在SomeClass设置模拟Service对象。 我能想到的唯一方法是将SomeClass转换为具体的类以调用setService(...) ,但是,我得到了ClassCastException,说$ Proxy与SomeClassImpl不兼容 我相信我所有的bean连接都是基于代理的,因为我正在使用AOP来配置事务。 我真的不想在SomeClass接口中公开setService(...) ,因为在我的生产代码中这样做是没有意义的。

我有办法做到这一点吗?

谢谢。

您可以使用@Resource批注获取实现

@Resource
private SomeClassImpl someClass;
...
someClass.setService(service);
...
  1. 使用其他接口进行服务设置。 要么
  2. 不要自动连线服务,而是在测试中使用“ new”运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM