SpringBoot MVC - объект ответа с возвратом, ноль - PullRequest
1 голос
/ 05 мая 2019

Ответная организация должна возвращать новую ResponseEntity со статусом http OK / 200.Тем не менее, во время моего тестирования он возвращается как ноль, я могу видеть, где он устанавливается на ноль, но не понимаю, почему или даже как.Я уверен, что это простая вещь, которую я пропустил, но просто не вижу этого.

Как видно на изображениях, переменная create является нулевой, однако Mockitio должен установить для нее значение createBlogPostResponse1, поэтому я не уверен, почему устанавливается нулевое значение.

Vars/services instantiated create being set to null

Спасибо за любую информацию и помощь по этому вопросу.

Тест

public static ResponseEntity createBlogPostResponse1 = new ResponseEntity(HttpStatus.OK);


@Test
public void createNewBlogPost() throws Exception {
    String url = TestHelper.URL + "/blogPost/createNewBlogPost";
    when(postService.createNewBlogPost(blogPost1)).thenReturn(TestHelper.createBlogPostResponse1);
    mockMvc.perform(post(url)
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(TestHelper.asJsonString(blogPost1)))
            .andExpect(status().isOk())
            .andReturn();

    verify(postService, times(1)).createNewBlogPost(blogPost1);
    verifyNoMoreInteractions(postService);
}

Контроллер

ResponseEntity create = postService.createNewBlogPost(cleanBlogPost);

Сервис

@Override
public ResponseEntity createNewBlogPost(BlogPost createNewBlogPost) {
    return new ResponseEntity(HttpStatus.OK);
}

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Как указал JBnizet, mockito внутренне использует метод equals, чтобы сопоставить аргументы при вызове mock-метода. Попробуйте переопределить equals метод для BlogPost класса. Если вы не хотите переопределять equals и просто хотите сопоставить любой вызов метода на макете - используйте any() matcher:

    @Test
    public void createNewBlogPost() throws Exception {
        String url = TestHelper.URL + "/blogPost/createNewBlogPost";
        when(postService.createNewBlogPost(Mockito.any(BlogPost.class))).thenReturn(TestHelper.createBlogPostResponse1);
        mockMvc.perform(post(url)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(TestHelper.asJsonString(blogPost1)))
                .andExpect(status().isOk())
                .andReturn();

        verify(postService, times(1)).createNewBlogPost(Mockito.any(BlogPost.class));
        verifyNoMoreInteractions(postService);
    }

Если вы хотите получить базовые знания о матчах, попробуйте этот учебник.

1 голос
/ 05 мая 2019

Как уже говорилось, Mockito полагается на equals() для сопоставления аргументов, но переопределение equals() для успешного выполнения модульного теста, как правило, не очень хорошая идея. Переопределение equals() должно иметь смысл для соответствующего класса. Если переопределение имеет смысл, пойти на это. В противном случае здесь есть альтернатива, где вы можете использовать совмещение any() в сочетании с проверкой содержимого значений свойств параметров, таких как:

 when(postService.createNewBlogPost(Mockito.any(BlogPost.class)))
.then( answer -> { 
                   BlogPost post = (BlogPost) invocation.getArguments()[0]; // get the first arg
                   Assert.assertEquals(blogPost1.getFoo(), post.getFoo());
                   Assert.assertEquals(blogPost1.getBar(), post.getBar());
                   return TestHelper.createBlogPostResponse1();
                   });

В то время как для утверждений без использования equals() для объекта, я бы предпочел AssertJ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...