Проблема теста Springboot: Mockito возвращает пустой объект - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь создать прототип, который использует gradle в качестве инструмента сборки и openjdk-11. Этот прототип будет создавать rest-api на платформе Springboot.

Мой модуль работает нормально с вызовом rest-api и возвращает ожидаемый результат . Однако, поскольку я сейчас пытаюсь написать тест для остальных API, этот тест не выполняется, так как Mockito возвращает пустой объект. Буду признателен за понимание того, как мне написать тест для этого rest-api или что нужно сделать, чтобы это исправить.

Мой контроллер:

@RestController
public class GreetingController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@Autowired
GreetingService service;

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
    return service.getGreetings(0L, String.format(template, name));
}
}

Услуга:

@Service
public class GreetingService {

public Greeting getGreetings() {
    return new Greeting(1L, "Hello World");
}

public Greeting getGreetings(Long id, String name) {
    return new Greeting(id, name);
}
}

Модель:

@Builder
@Data
@RequiredArgsConstructor
@JsonDeserialize(builder = Greeting.class)
public class Greeting {
    @NonNull
    private Long id;

    @NonNull
    private String content;

}

Основной класс:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Я выполнил это:

gradle bootrun

А потом из браузера пробовал:

http://localhost:8080/greeting 

И это вернулось:

{"id":0,"content":"Hello, World!"}

Снова попробовал:

http://localhost:8080/greeting?name=Patty

и что вернулось:

{"id":0,"content":"Hello, Patty!"}

Теперь я пытался написать тест для проверки API-вызовов, аналогично вышеуказанным вызовам программно. Итак, я попробовал:

@RunWith(MockitoJUnitRunner.class)
public class GreetingControllerTest {

    private MockMvc mockMvc;

    @Mock
    private GreetingService service;

    @InjectMocks
    private GreetingController controller


    @Test
    public void testGreeting() throws Exception {

        Greeting  greeting  = new Greeting(0L,"Patty!");
        String expectedResponse  = "{\"id\":0,\"content\":\"Hello, Patty!\"}";


        //JacksonTester.initFields(this, new ObjectMapper());
        mockMvc = MockMvcBuilders.standaloneSetup(controller)
                .build();
        Mockito.when(service.getGreetings(0L,"Patty")).thenReturn(greeting);


        MockHttpServletResponse response = mockMvc
                .perform(get("/greeting?name=Patty")
                        .contentType(MediaType.ALL))
                .andReturn()
                .getResponse();


        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo(expectedResponse)


    }




}

Сообщение об ошибке:

org.junit.ComparisonFailure: 
Expected :"{"id":0,"content":"Hello, Patty!"}"
Actual   :""

Отказ от этой строки:

assertThat(response.getContentAsString()).isEqualTo(expectedResponse)

Заранее спасибо.

1 Ответ

0 голосов
/ 12 июля 2019

Это помогло мне понять: Mockito - thenReturn всегда возвращает нулевой объект

Я изменил Mockito.when часть на:

Mockito.when(service.getGreetings(Mockito.anyLong(),Mockito.anyString())).thenReturn(greeting);

и все заработало

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