У меня есть класс-наследник com.rabbitmq.client.DefaultConsumer из библиотеки RabbitMQ. Надо протестировать этот класс. Я использую spock для тестов. Создаю mock класса com.rabbitmq.client.Channel, хочу заменить вызов Channel.basicPublish на заглушку (чтобы вызывался метод Consumer.handleDelivery, который я перегрузил):
class MessagesSpec extends Specification {
def "Sending messages"() {
given:
def consumeTag = "consumer"
def exchange = "foo.bar"
def routingKey = "baz"
def message = "message"
def basicProperties = new BasicProperties()
def envelope = new Envelope(1, false, exchange, routingKey)
def channel = Mock(Channel)
AMQMessageConsumer<Message<String>> consumer = new AMQMessageConsumer<Message<String>>(String.class, channel) // Это тестируемый объект
channel.basicPublish(_ as String, _ as String, _ as BasicProperties, _ as byte[]) >> {
String e, String rk, BasicProperties bp, byte[] m ->
consumer.handleDelivery(consumeTag, envelope, bp, m)
} // Тут заглушка для basicPublish, должен вызываться реальный метод тестируемого класса
when:
channel.basicPublish(exchange, routingKey, basicProperties, message.getBytes()) // Вызываю заглушку
then:
1 * consumer.handleDelivery(*_)
}
}
Однако в результате запуск consumer.handleDelivery не происходит:
Too few invocations for:
1 * consumer.handleDelivery(*_) (0 invocations)
Unmatched invocations (ordered by similarity):
None
Как правильно mock'нуть всё это дело, а то я что-то туплю и не могу сообразить