Я получаю следующее исключение при выполнении тестов. Я использую Mockito для насмешек. Упоминания библиотеки Mockito не помогают.
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at com.a.b.DomainTestFactory.myTest(DomainTestFactory.java:355)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
at a.b.DomainTestFactory.myTest(DomainTestFactory.java:276)
..........
Тестовый код от DomainTestFactory
. Когда я запускаю следующий тест, я вижу исключение.
@Test
public myTest(){
MyMainModel mainModel = Mockito.mock(MyMainModel.class);
Mockito.when(mainModel.getList()).thenReturn(getSomeList()); // Line 355
}
private List<SomeModel> getSomeList() {
SomeModel model = Mockito.mock(SomeModel.class);
Mockito.when(model.getName()).thenReturn("SomeName"); // Line 276
Mockito.when(model.getAddress()).thenReturn("Address");
return Arrays.asList(model);
}
public class SomeModel extends SomeInputModel{
protected String address;
protected List<SomeClass> properties;
public SomeModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
public String getAddress() {
return this.address;
}
}
public class SomeInputModel{
public NetworkInputModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
protected String Name;
protected List<SomeClass> properties;
public String getName() {
return this.Name;
}
public void setName(String value) {
this.Name = value;
}
}
Ответы:
Вы вложили насмешку в насмешку. Вы звоните
getSomeList()
, что делает насмешку, прежде чем закончить издеватьсяMyMainModel
. Мокито не нравится, когда ты делаешь это.замещать
с участием
Чтобы понять, почему это вызывает проблемы, вам нужно немного узнать о том, как работает Mockito, а также знать, в каком порядке выражения и операторы оцениваются в Java.
Mockito не может прочитать ваш исходный код, поэтому для выяснения того, что вы просите его сделать, он во многом зависит от статического состояния. Когда вы вызываете метод для фиктивного объекта, Mockito записывает детали вызова во внутренний список вызовов.
when
Метод читает последний из этих вызовов из списка и записывает этот вызов вOngoingStubbing
объекте он возвращает.Линия
вызывает следующие взаимодействия с Mockito:
mainModel.getList()
называется,when
называется,thenReturn
вызывается дляOngoingStubbing
объекта, возвращаемогоwhen
методом.Затем
thenReturn
метод может дать указание макету, который он получил черезOngoingStubbing
метод, обработать любой подходящий вызовgetList
метода для возвратаsomeModelList
.На самом деле, поскольку Mockito не видит ваш код, вы также можете написать свой макет следующим образом:
Этот стиль несколько менее понятен для чтения, тем более что в этом случае
null
он должен быть приведен, но он генерирует ту же последовательность взаимодействий с Mockito и достигнет того же результата, что и строка выше.Тем не менее, линия
вызывает следующие взаимодействия с Mockito:
mainModel.getList()
называется,when
называется,mock
изSomeModel
создан (внутриgetSomeList()
),model.getName()
называется,В этот момент Мокито запутывается. Он думал, что вы издеваетесь
mainModel.getList()
, но теперь вы говорите, что хотите издеваться надmodel.getName()
методом. Для Мокито, похоже, вы делаете следующее:Это выглядит глупо,
Mockito
поскольку не может быть уверенным, что вы делаете сmainModel.getList()
.Обратите внимание, что мы не получили
thenReturn
вызов метода, поскольку JVM должна оценить параметры этого метода, прежде чем он сможет вызвать метод. В этом случае это означает вызовgetSomeList()
метода.Как правило, плохое проектное решение полагаться на статическое состояние, как это делает Mockito, потому что это может привести к нарушениям принципа наименьшего удивления. Тем не менее, дизайн Mockito действительно делает для ясного и выразительного насмешки, даже если это иногда приводит к удивлению.
Наконец, последние версии Mockito добавляют дополнительную строку к сообщению об ошибке выше. Эта дополнительная строка указывает, что вы можете оказаться в той же ситуации, что и этот вопрос:
источник
Для насмешек над пустыми методами попробуйте ниже:
источник