Имитация объекта Spring boot, возвращающего нуль при вызове

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

Попробуйте @RunWith (MockitoJUnitRunner.class) или, если вам нужно использовать SpringRunner, инициализируйте свои макеты - см. stackoverflow.com/questions/10806345/…

tgdavies 08.05.2018 03:08

Вы добавили @SpringBootTest в свой тест?

Luay Abdulraheem 08.05.2018 05:41

@tgdavies Согласен, но это совсем другая история. Уверен, @RunWith(MockitoJUnitRunner.class) подойдет. @Luay - @SpringBootTest тоже не работает.

vsk.rahul 08.05.2018 08:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
3
6 908
3

Ответы 3

Я понял. Но решение все еще для меня странное ...

Я столкнулся с этой проблемой, потому что я создавал экземпляры 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 понять, что это тот, которого вы ждете.

Florian Schaetz 08.05.2018 09:34

Я столкнулся с аналогичной ситуацией, проблема в том, что параметр в блоке 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";
}

Другие вопросы по теме