2016-10-27 4 views
1

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

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

@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"))); 
    } 

ответ

0

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

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

@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>); 
} 
+1

Спасибо. У меня на самом деле есть класс для «ServiceTests», который почти выглядит точно так, как вы показали. Начиная с нуля, я бы создал уровень сервиса, который контроллер делегирует, а затем он имеет бизнес-логику и вызывает репозитории для данных. Я хочу просто протестировать вызов конечных точек с возвратными фиктивными данными и проверить некоторые значения JSON и статус http. Если я не издеваюсь над контроллером, у меня возникают проблемы, так как в методе контроллера есть некоторые частные методы, которые нельзя обрезать. – Mike

+0

Мне не совсем ясно, что вы пытаетесь проверить. Я думал, вы хотели проверить свой контроллер. Но если вы просто издеваетесь над этим и сразу возвращаете некоторые данные, что вы тогда тестируете? – borowis