Как смоделировать инъекции классов обслуживания в инфраструктуре тестирования Спока? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть Java-сервис, в который Guice вводит несколько вещей.

public class RecoveryServiceImpl implements RecoveryService {
    @Inject
    public RecoveryServiceImpl(SessionInstanceCache sessionInstanceCache, AttendeeCache attendeeCache, MessagingStreamConfiguration messagingConfig) {
        this.sessionInstanceCache = sessionInstanceCache;
        this.attendeeCache = attendeeCache;
        this.messagingConfig = messagingConfig;
    }

    @Override
    public SessionInstanceData recoverSessionInstance(SessionInstanceDto sessionInstance) {
        SessionInstanceData sessionInstanceData = SessionInstanceHelper.recoverSessionInstance(sessionInstance);

        if (sessionInstanceData.getDeepstreamServerKey() == null) {
            String dsKey = SessionInstanceHelper.pickRandomDeepstreamServerKey(
                sessionInstanceData, messagingConfig);

И это делает:

public static String pickRandomDeepstreamServerKey(
        SessionInstanceData sessionInstanceData, MessagingStreamConfiguration dsConfig) {
    // NPE occurs here
    List<String> dsKeys = new ArrayList(dsConfig.getBaseUrls().keySet()); 

Это проверено Споком.Я добавил messagingConfig, и теперь я изо всех сил пытаюсь сделать это в тесте Спока:

class RecoveryServiceImplTest extends Specification {

...
    MessagingStreamConfiguration msgConfig = Mock(MessagingStreamConfiguration);
    RecoveryService recoveryService = new RecoveryServiceImpl(sessionInstanceCache, attendeeCache, msgConfig);

    def "Recover session instance"() {
        ...
        def dsMap = new HashMap<String, URL>();
        dsMap.put("ds1", new URL("http://ilovemocking.com/"));

        when:
        msgConfig.getBaseUrls() >> dsMap;
        //msgConfig.getBaseUrls().keySet() >> new HashSet(){{add("ds1")}};
        recoveryService.recoverSessionInstance(sessionInstanceDto)

При вызове recoverSessionInstance() я получаю NPE, потому что getBaseUrls() возвращает ноль.

Я пробовал другой способ, создание экземпляра msgConfig как обычного объекта (AKA "stubbing"), но тот же результат.

Как мне заставить Спока Мока возвращать dsMap вместоnull?

1 Ответ

0 голосов
/ 19 октября 2018

В конце концов, это была некоторая проблема с отсутствующим методом в зависимости .jar (по сравнению с тем, что я видел как код).NPE исходил от прокси-сервера Mock, а не от самого выражения.Однако это было трудно увидеть в трассировке стека, полной отражений.

Я удалю вопрос через некоторое время.

...