Как установить фиктивный объект в компоненте Spring на основе прокси? - PullRequest
0 голосов
/ 07 апреля 2011

У меня проблемы с попыткой установить фиктивный объект в моем проводном компоненте в моем тестовом примере.

Вот моя упрощенная задача: -

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 интерфейсе, потому что нет смысла делать это в моем производственном коде.

Есть ли способ для меня это сделать?

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Вы можете использовать аннотацию @ Resource , чтобы получить реализацию :

@Resource
private SomeClassImpl someClass;
...
someClass.setService(service);
...
0 голосов
/ 07 апреля 2011
  1. Использовать дополнительный интерфейс для Service Setter чем. или
  2. Не используйте Autowire Service, но используйте оператор 'new' в вашем тесте.
...