2016-04-08 3 views
0

Я написал пару тестов JUnit, чтобы проверить функциональность REST. Поскольку я только хочу протестировать REST (а не базу данных, логику домена, ..), я сделал заглушки с фиктивными данными, что означает остальную часть бэкэнда.Как динамически загружать разные классы для тестов JUnit?

[EDIT] Например, я хочу протестировать/клиенты/все . Запрос GET будет отвечать арраисту, содержащему все имена.

I поэтому использование MockMV.

this.mockMvc.perform(get("/customers/all").accept("application/json")) 
      .andExpect(status().isOk()) 
      .andExpect(jsonPath("$").isNotEmpty()) 
      .andExpect(jsonPath("$[0].name", is("John"))); 

Когда вы обычно выполняете запрос GET в сторону/клиентов/все запросы будут отправлены в базу данных. Теперь, чтобы проверить мой контроллер REST, я сделал заглушку, которая отвечает GET/customers/all с простым arraylist, содержащим только мое имя (как вы можете видеть в тесте). Когда я тестирую этот локальный, я просто заменяю настоящий класс этим заглушкой. Как это делается динамически?

+0

Контроллеры испытываются, как и любой другой класс, за исключением того, что они, как правило, немой и будет делегировать большое количество работы других классов, за исключением , То, что вы хотите сделать, состоит в том, чтобы издеваться над всеми другими классами, участвующими в обработке, и в связи с контроллером. Поэтому, чтобы ответить на ваш вопрос, я бы сказал, что мне кажется, что ваш подход кажется неправильным. Не могли бы вы прояснить, о чем вы говорите? – LoreV

+0

Я использую MockMVC для тестирования моего REST. Если я не использую заглушку для остальной части моего бэкенда, каждый тест, который я делаю с MockMVC, будет выполнять запрос к остальной части моего бэкэнда, не так ли? – Dai

+0

MockMvc используется для тестов интеграции, также называемых End2End. Они предназначены для тестирования более чем единицы вашего кода. См. Http://www.petrikainulainen.net/programming/spring-framework/integration-testing-of-spring-mvc-applications-configuration/. Однако после вашего вопроса я рекомендовал бы использовать Mockito для создания модульных тестов для вашего контроллера, прежде чем продолжить работу с инфраструктурой интеграции MockMVC. – LoreV

ответ

2

Я не думаю, что ваш подход является хорошим. Просто используйте ваш реальный контроллер, но заглушите его зависимости (например, с помощью Mockito), как и для традиционного модульного теста.

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

Thias подход описан в the documentation.

Пример использования Mockito, предполагая делегатов контроллера к CustomerService:

public class CustomerControllerTest { 

    @Mock 
    private CustomerService mockCustomerService; 

    @InjectMocks 
    private CustomerController controller; 

    private MockMvc mockMvc; 

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

    @Test 
    public void shouldListCustomers() { 
     when(mockCustomerService.list()).thenReturn(
      Arrays.asList(new Customer("John"), 
          new Customer("Alice"))); 

     this.mockMvc.perform(get("/customers").accept("application/json")) 
      .andExpect(status().isOk()) 
      .andExpect(jsonPath("$").isNotEmpty()) 
      .andExpect(jsonPath("$[0].name", is("John"))); 
    } 
} 
+0

Я использую свои реальные контроллеры REST. Все мои контроллеры REST взаимодействуют с интерфейсом. Этот интерфейс является шлюзом для моей логики домена. Поскольку у меня есть несколько контроллеров REST, было бы намного проще - как-то - заменить этот интерфейс заглушкой. Это то, что вы говорите? – Dai

+0

Ну, вот что это делает: он заменяет CustomerService заглушкой. Но заглушка не является глобальной для приложения. Он специфичен для теста и возвращает значения, необходимые для этого теста. Возможно, еще один тест должен проверить, что контроллер усекает список до 1000 элементов, если служба возвращает более 1000 клиентов. Нет проблем: просто напишите еще один тест, в котором служба будет забита, чтобы вернуть 10001 клиентов. –

+0

Потому что Mockito - это насмешливая структура, которая позволяет динамически создавать заглушки/макеты, без необходимости явно писать фальшивую реализацию интерфейса для заглушки. –

Смежные вопросы