Весеннее тестирование - тестовая конечная точка с макетом контроллера

У меня есть существующее приложение, для которого я пытаюсь написать модульные тесты... Нет реального слоя обслуживания. Идет контроллер-> репозиторий-> база данных, а конечные точки определяются через аннотации на контроллере. Я использую Spring Boot 1.3.8 (не 1.4).

То, что я хочу сделать, это заставить контроллер вернуть поддельную коллекцию, которую я могу проверить. Что происходит INSTEAD, так это приложение, которое загружается и загружаются реальные данные, а когда я вызываю конечную точку, возвращаются реальные данные приложения. Итак, кажется, у меня есть 2 проблемы: я делаю настройку данных и конфигурацию, которую я не хочу выполнять в модульном тесте, и, во-вторых, мой фиктивный контроллер игнорируется. Они, вероятно, связаны. Любая помощь приветствуется. Благодарю.

 @Autowired
    private WebApplicationContext context;
    private MockMvc mockMvc;

    @Mock
    private ApplicationController applicationController = new ApplicationController();

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

    @Test
    public void contextLoads() {}

    @Test
    public void testEndPoints() throws Exception  {
        Application testApp = TestUtils.generateApplication();
        Mockito.when(applicationController.getApplications()).thenReturn(Arrays.asList(testApp));
        log.info("Verifying applications endpoint is up and running.");

        mockMvc.perform(get("/applications/")).andExpect(status().isOk())
               .andDo(print())
               .andExpect(content().contentType(TestUtils.APPLICATION_JSON_UTF8))
               .andExpect(jsonPath("$.[0].name",is("my_name")));
    }

1 ответ

Обычно в таком случае фиктивное хранилище внедряется в контроллер, так что вы можете смоделировать метод в хранилище, иметь нужную коллекцию, выполнить некоторую обработку внутри контроллера и вернуть измененную коллекцию. Затем ваш модульный тест проверяет, что эта обработанная коллекция соответствует ожиданиям.

Что-то вроде:

@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;

@InjectMocks
private ApplicationController applicationController;

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

   when(applicationRepository.findAllByIds(anyListOf(Long.class))
        .thenReturn(<the collection you want to be processed by controller>);
}
Другие вопросы по тегам