Mockito when (). ThenReturn () Возвращает Null, когда должен возвращаться пустой список - PullRequest
1 голос
/ 01 ноября 2019

Я пытался выяснить, почему мой поддельный метод findIngredientsByCategory возвращает ноль, когда у меня when(controller.findIngredientsByCategory(any()).thenReturn(Collections.emptyList()). Эта реализация работает для метода findAll.

Ниже приведена моя реализация для моего модульного теста:

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(IngredientController.class)
@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class})
@WebAppConfiguration
public class IngredientControllerTest {

  @Autowired
  private WebApplicationContext context;

  @Autowired
  private MockMvc mvc;

  @MockBean
  private IngredientController ingredientController;

  @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);
    mvc = MockMvcBuilders.webAppContextSetup(context).build();
  }

  @Autowired
  private ObjectMapper mapper;

  private static class Behavior {
    IngredientController ingredientController;

    public static Behavior set(IngredientController ingredientController) {
      Behavior behavior = new Behavior();
      behavior.ingredientController = ingredientController;
      return behavior;
    }

    public Behavior hasNoIngredients() {
      when(ingredientController.getAllIngredients()).thenReturn(Collections.emptyList());
      when(ingredientController.getIngredientsByCategory(any())).thenReturn(Collections.emptyList());
      when(ingredientController.getIngredientById(anyString())).thenReturn(Optional.empty());
      return this;
    }
  }

  @Test
  public void getIngredientsByCategoryNoIngredients() throws Exception {
    Behavior.set(ingredientController).hasNoIngredients();
    MvcResult result = mvc.perform(get("/ingredients/filter=meat"))
        .andExpect(status().isOk())
        .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
        .andReturn();
    String content = result.getResponse().getContentAsString();
    System.out.println(content);
 }

А ниже приведена реализация для контроллера:

@RestController
@RequestMapping("/ingredients")
public class IngredientController {

  @Autowired
  private IngredientRepository repository;

  @RequestMapping(value = "/filter", method = RequestMethod.GET)
  public List getIngredientsByCategory(@RequestParam("category") String category) {
    return repository.findByCategory(category);
  }
}

Я не уверен, почему контроллер mock возвращает ноль с этим запросом, когда я говорю ему вернуть пустой список. Если кто-то может помочь с этим, я был бы очень признателен! Благодаря.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

На самом деле MockMvc будет вызывать IngredientController, который загружается и создается платформой Spring Test, но не будет вызывать фиктивный IngredientController, который вы аннотировали @MockBean, поэтому все сделанные вами заглушки не будутПозвонил.

На самом деле, смысл @WebMvcTest состоит в том, чтобы проверить @RestController, и связанная с ним конфигурация Spring настроена правильно, поэтому необходимо создать реальный экземпляр IngredientController, а не использовать поддельный. Вместо этого вы должны смоделировать зависимости внутри IngredientController (т.е. IngredientRepository).

Итак, коды должны выглядеть так:

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(IngredientController.class)
@ContextConfiguration(classes = {TestContext.class, WebApplicationContext.class})
@WebAppConfiguration
public class IngredientControllerTest {

  @Autowired
  private WebApplicationContext context;

  @Autowired
  private MockMvc mvc;

  @MockBean
  private IngredientRepository ingredientRepository;


  @Test
  public void fooTest(){
    when(ingredientRepository.findByCategory(any()).thenReturn(Collections.emptyList())

    //And use the MockMvc to send a request to the controller, 
    //and then assert the returned MvcResult
  }

}
0 голосов
/ 01 ноября 2019

Путь запроса Th в тесте - "/ ингридиенты / фильтр = мясо", но он должен быть "/ ингридиенты / фильтр? Категория = мясо". Итак, похоже, что getIngredientsByCategory не был вызван.

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