2016-07-22 4 views
1

У меня есть метод:Использование Mockito для макета метода с параметром Object

public class Sender{ 
    public Object send(Object param){ 
    Object x; 
    ..... 
    return (x); 
    } 
} 

Я хочу написать модульный тест для этого метода с использованием Mockito такого, что возвращаемое значения типа на основе типа класса от параметра Я , Так что я сделал это:

when(sender.send(Matchers.any(A.class))).thenReturn(value1); 
when(sender.send(Matchers.any(B.class))).thenReturn(value2); 

но возвращаемое значение независимо от типа класса параметра всегда значение 2. Как это получить это вернуть значение 1 для класса А аргумент типа и значение 2 для типа класса B аргумента.

ответ

1

when(sender.send(Matchers.any(A.class))).thenReturn(value1);

Mockito будет пытаться высмеивать метод с подписью send(A param), не send(Object param).

Что вам нужно, это вернуть другую базу значений в класс вашего параметра. Для этого вам нужно использовать ответы.

Mockito.doAnswer(invocationOnMock -> { 
    if(invocationOnMock.getArguments()[0].getClass() instanceof A) { 
     return value1; 
    } 
    if(invocationOnMock.getArguments()[0].getClass() instanceof B) { 
     return value2; 
    } 
    else { 
     throw new IllegalArgumentException("unexpected type"); 
    } 
}).when(mock).send(Mockito.anyObject()); 
+0

Точно, о чем я думал, но слишком ленив, чтобы написать :-) –

+0

@noscreenname Ahh! Можете ли вы преобразовать это, чтобы не использовать выражение лямбда, пожалуйста? Я понимаю намерение, но не могу его воспроизвести. – Sherlock123

+0

@ Sherlock123 Я мог бы, но так мог бы, если бы вы посмотрели Mockito.doAnswer() documentation;) – noscreenname

0

пара вариантов:

  1. Не используйте any. Используйте экземпляр A или B, который вы используете в тесте.

  2. Используйте объект Answer, который позволит вам указать, что возвращать.

Смежные вопросы