2013-03-21 3 views
16

Я новичок в Mockito, я попытался изучить это исключение, но я не нашел конкретного ответа. Это происходит в моем коде, когда я использую два макета вместе, что означает, что я передаю конструктор макета, еще один макет. Как так:Mockito UnfinishedStubbingException

... 
OperationNode child = getNode(Operation.ADD); 
child.insertNode(getConstantNode(getIntegerValue(2)); 
... 

private ConstantNode getConstantNode(NumericalValue value){ 
    ConstantNode node = Mockito.mock(ConstantNode.class); 
    Mockito.when(node.evaluate()).thenReturn(value); 
    Mockito.when(node.toString()).thenReturn(value.toString()); 
    return node; 
} 

private IntegerValue getIntegerValue(int number) { 
    IntegerValue integerValue = Mockito.mock(IntegerValue.class); 
    Mockito.when(integerValue.getValue()).thenReturn(number); 
    Mockito.when(integerValue.toString()).thenReturn(Integer.toString(number)); 
    return integerValue; 
} 

В одном из форумов я прочитал о не послав издеваться через конструктор другие издеваться, так как Mockito может запутаться с фиктивными вызовами, поэтому я попытался следующее:

NumericalValue value = getIntegerValue(2); 
child.insertNode(getConstantNode(value)); 

Но безрезультатно. Я убеждаюсь, что вызываются только методы toString() и getValue(), потому что это единственные методы, которые имеет класс. Я не понимаю, что происходит.

Я также попытался с помощью издевается отдельно, чтобы увидеть, если я сделал что-то неправильно:

child.insertNode(new ConstantNode(getIntegerValue(2))); 

Это прекрасно работает.

child.insertNode(getConstantNode(new IntegerValue(2))); 

Это хорошо работает.

+1

известная проблема 'https: //code.google.com/p/mockito/issues/detail? Id = 53' –

+2

Ссылка на клик: https://code.google.com/p/mockito/issues/detail? id = 53 –

ответ

22

Из того, что я прочитал на «Выпуск 53» из Mockito (https://code.google.com/p/mockito/issues/detail?id=53), мой код испытывает проблемы из-за рамки проверки, участвующих в Mockito. Именно следующий код вызывал исключение как таковое.

private ConstantNode getConstantNode(NumericalValue value){ 
    ConstantNode node = Mockito.mock(ConstantNode.class); 
    Mockito.when(node.evaluate()).thenReturn(value); 
    Mockito.when(node.toString()).thenReturn(value.toString()); 
    return node; 
} 

Если вы помните из моего кода, значение параметра ТАКЖЕ макет, так что, когда value.toString() называется на thenReturn(), я считаю (и кто-то пожалуйста, поправьте меня, если я ошибаюсь), что рамки валидации запускается и гарантирует, что каждое «когда» имеет свой thenReturn(), называемый/подтвержденный/etc. Так что, если это произойдет, Mockito.when(node.toString()).thenReturn(value.toString()не будет проверен, потому что он не вернулся с valute.toString(), который запустил целую цепочку «проверять все».

Как я установил его:

private ConstantNode getConstantNode(NumericalValue value){ 
    ConstantNode node = Mockito.mock(ConstantNode.class); 
    Mockito.when(node.evaluate()).thenReturn(value); 

    String numberToString = value.toString(); 

    Mockito.when(node.toString()).thenReturn(numberToString); 
    return node; 
} 

Таким образом, он может быть подтверждено. Я нахожу этот полный запах кода, потому что мне буквально придется оставить комментарий, который объясняет, почему я использую, казалось бы, бесполезную промежуточную переменную в коде.

Спасибо за помощь.

+0

Спасибо! Наконец, я начинаю понимать эту странную проблему. –

+0

Рад, что я мог бы помочь! – Chayemor

0

Я думаю, что это проблема с заказом вызовов и проверки Mockito Framework. Попробуйте это и посмотреть, если это помогает:

... 
OperationNode child = getNode(Operation.ADD); 
IntegerValue value = getIntegerValue(2); 
ConstantNode node = Mockito.mock(ConstantNode.class); 
Mockito.when(node.evaluate()).thenReturn(value); 
Mockito.when(node.toString()).thenReturn(value.toString()); 
child.insertNode(node); 

... 

private IntegerValue getIntegerValue(int number) { 
    IntegerValue integerValue = Mockito.mock(IntegerValue.class); 
    Mockito.when(integerValue.getValue()).thenReturn(number); 
    Mockito.when(integerValue.toString()).thenReturn(Integer.toString(number)); 
    return integerValue; 
} 

Источник: https://code.google.com/p/mockito/issues/detail?id=53

+0

Разве это не то же самое, просто без метода на пути? ... Так или иначе, я попробовал, бесполезно. – Chayemor

2

Я думаю, что проблема с линией

Mockito.when(node.toString()).thenReturn(value.toString()); в методе getConstantNode

Попробуйте удалить строку и проверить, работает ли он , Может быть, вы можете сделать что-то вроде

int num = 2; 
child.insertNode(getConstantNode(getIntegerValue(num), num); 
... 

private ConstantNode getConstantNode(NumericalValue value){ 
    ConstantNode node = Mockito.mock(ConstantNode.class); 
    Mockito.when(node.evaluate()).thenReturn(value); 
    Mockito.when(node.toString()).thenReturn(Integer.toString(number)); 
    return node; 
} 

private IntegerValue getIntegerValue(int number) { 
    IntegerValue integerValue = Mockito.mock(IntegerValue.class); 
    Mockito.when(integerValue.getValue()).thenReturn(number); 
    return integerValue; 
} 
+0

Адрес: с какого числа показывается количество? – AHungerArtist

+0

Решил проблему исключения, но я до сих пор не понимаю динамики относительно того, почему это происходит. Я прочитал ссылку на проблему, помещенную в первый комментарий, но я до сих пор не понимаю. – Chayemor

4

В этом вопросе уже есть некоторые исправления, но для тех, кто все еще не понимает этого, подумайте о порядке, в котором Java вызывает все эти методы. Согласно Java Language Specification, Java evaluates every parameter of a method left-to-right before calling the method:

  1. integerValue.getValue(), который Mockito записывает
  2. when, где Mockito принимает последний звонок (для integer.getValue) и начинает затвердевать до гася
  3. value.toString, который является высмеивал вызов, Mockito записывает
  4. thenReturn на stubber

Mockito жалуется точно, потому что вызов макету, шаг 3, происходит после, шаг 2 (when), но до, шаг 4 (thenReturn), в результате чего структура проверки жалуется на ступицу. Радость, ваш ответ перемещает сложный шаг 3 до этапа 1, и это нормально; Саджан полностью исключает его из утверждения, что тоже прекрасно.

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