У меня проблемы с попыткой установить фиктивный объект в моем проводном компоненте в моем тестовом примере.
Вот моя упрощенная задача: -
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";
}
}
В этом примере я пытаюсь проверить SomeClass
, вычеркнув Service.doIt()
, чтобы я мог проверить различные условия. Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как именно мне следует установить фиктивный объект Service в SomeClass
. Единственный способ, которым я могу придумать, - это перевести SomeClass
в конкретный класс для вызова setService(...)
, однако я получаю исключение ClassCastException, говорящее о том, что $ Proxy несовместим с SomeClassImpl . Я считаю, что все мои bean-соединения основаны на прокси, потому что я использую AOP для настройки транзакции. Я действительно не хочу показывать setService(...)
в SomeClass
интерфейсе, потому что нет смысла делать это в моем производственном коде.
Есть ли способ для меня это сделать?
Спасибо.