Mockito when/thenReturn всегда возвращает значение null в тесте Scala при попытке издеваться над rabbitmq ConnectionFactory

Я пытаюсь издеваться над объектом RabbitMQ ConnectionFactory, чтобы вернуть фиктивное соединение, используя scalatest и mockito. Ниже приведен пример теста, который я использую:

class RabbitMQMockTest extends FunSuite with MockitoSugar {
    test("RabbitMQ ConnectionFactory is correctly mocked") {
        def connectionFactory = mock[ConnectionFactory]
        def connection = mock[Connection]

        when(connectionFactory.newConnection()).thenReturn(connection)
        println(connectionFactory.newConnection())

        assert(connectionFactory.newConnection() != null)
    }
}

Это всегда терпит неудачу, и оператор println всегда печатает «null». Я новичок в использовании этих технологий вместе, и мне было интересно, есть ли у кого-нибудь совет или кто-нибудь может сообщить мне, если я делаю что-то не так. Заранее спасибо!


person Bryan    schedule 28.12.2011    source источник
comment
Можете ли вы разбить свой тест, чтобы полагаться только на макет Connection? Как правило, таким образом имитировать несколько уровней зависимостей неприятно — в конечном итоге вы будете поддерживать много хрупкого фиктивного кода, который сам по себе не добавляет ценности вашему проекту.   -  person earldouglas    schedule 30.12.2011
comment
Да, я согласен, что макет, который возвращает макет, обычно является тестовым запахом. Для чего-то близкого к связующим вещам я бы вместо этого написал интеграционные тесты, а не модульные тесты. Что касается вашей проблемы, у вас такое же неустойчивое поведение с другими классами (например, с вашими классами).   -  person Brice    schedule 01.01.2012
comment
Эй, ребята, спасибо за ответы! Я определенно согласен с вами обоими, что это далеко не идеально, и я планирую провести рефакторинг тестируемого класса, чтобы обеспечить лучшее внедрение зависимостей. Однако я решил свою проблему, и оказалось, что я допустил ошибку с костяком. Я определил фиктивные классы, используя 'def' вместо 'val' или 'var', так что получается, что я создавал новый фиктивный объект каждый раз, когда вызывал один из методов. Извините за потраченное время, ребята, еще раз спасибо за комментарии!   -  person Bryan    schedule 03.01.2012


Ответы (2)


Не определяйте случайно переменные с помощью 'def'! Я определил макеты, используя «def» вместо «val» или «var», поэтому я создал метод, который каждый раз возвращает новый макет вместо переменной.

person Bryan    schedule 03.01.2012
comment
На самом деле это очень распространенная ошибка, и я удивлен, что не часто упоминаю об этом в блогах/документах/и т. д. - person casey; 17.11.2015

Я думаю, что вы должны определить поведение на макете connection, прежде чем сможете его использовать. Например :

when(connection.createChannel()).thenReturn(new Channel {...})

или что-то в этом роде.

person David    schedule 30.12.2011
comment
Спасибо за ответ! Оказывается, я просто случайно использовал def для определения моков вместо val или var. - person Bryan; 03.01.2012