[英]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(...)
,因为在我的生产代码中这样做是没有意义的。
我有办法做到这一点吗?
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.