Я использую @RunWith(SpringRunner.class) для написания модульного теста, чтобы издеваться над объектом. Я пытаюсь издеваться над экземпляром репозитория, который принимает объект запроса и возвращает ответ, но в реализации модульного теста я высмеял репозиторий с помощью аннотации @MockBean и зарегистрировал его вызов метода с помощью Mockito.when(respository.post(request)).thenReturn(response). Но этот вызов возвращает null.
Вы добавили @SpringBootTest в свой тест?
@tgdavies Согласен, но это совсем другая история. Уверен, @RunWith(MockitoJUnitRunner.class) подойдет. @Luay - @SpringBootTest тоже не работает.




Я понял. Но решение все еще для меня странное ...
Я столкнулся с этой проблемой, потому что я создавал экземпляры request и response в аннотированном методе @Before ... как описано ниже.
@Before
public void setup() {
Request reqA = new Request();
reqA.set..(..);
Response res = new Response();
res.set..(..);
Mockito.when(this.respository.post(reqA)).thenReturn(res);
}
@Test
public void test() {
// Creating Request instance again with all same properties.
// Such that this req instance is technically similarly as instantiated in @Before annotated method (above).
// By, implementing the equals and hashCode method.
Request reqB = new Request();
reqB.set..(..);
// Getting res as 'null' here....
Response res = this.service.post(reqB);
}
Поскольку reqA и reqB технически похожи, почему фиктивный вызов не возвращает тот же ответ, что и зарегистрированный.
Если я переместил код метода setup() внутрь метода test(), все начнет работать !!!!!
Если Request не реализует равенства таким образом, чтобы reqA.equals( actualRequest ) возвращал true, то Mockito не будет знать, что этот "actualRequest" - это тот, который вы ищете. Перемещая его в метод тестирования, я предполагаю, что вы затем используете reqA в качестве фактического запроса, который, конечно же, работает, начиная с reqA == reqA, позволяя Mockito понять, что это тот, которого вы ждете.
Я столкнулся с аналогичной ситуацией, проблема в том, что параметр в блоке Mockito.when() может не совпадать с сгенерированным spring. Я объясню свой случай ниже, надеюсь помочь вам:
Product product = new Product(..);
Mockito.when(service.addProduct(product)).thenReturn(saveProduct)
Когда я отправляю запрос, spring генерирует новый объект Project, который имеет те же поля, что и product, но экземпляр другой. То есть Mockito не может поймать инструкцию when. Я изменил его, как показано ниже, и он сработал:
Mockito.when(service.addProduct(Mockito.any())).thenReturrn(savedProduct)
У меня была такая же проблема, мне очень помог комментарий vsk.rahul. Я пытался использовать метод для возврата фиктивного взаимодействия, но мне это не удалось, превращение его в статический метод дало мне ожидаемое поведение.
Проблема:
Метод bar.foo() возвращал null для любого взаимодействия.
public void test1() {
doReturn(mockReturn()).when(bar).foo();
}
private String mockReturn() {
return "abc";
}
Решение:
Метод bar.foo() возвращает строку abc для любого взаимодействия.
public void test1() {
doReturn(mockReturn()).when(bar).foo();
}
private static String mockReturn() {
return "abc";
}
Попробуйте @RunWith (MockitoJUnitRunner.class) или, если вам нужно использовать SpringRunner, инициализируйте свои макеты - см. stackoverflow.com/questions/10806345/…