Как проверить этот метод с помощью теста весенней загрузки? - PullRequest
0 голосов
/ 09 мая 2018

Я хочу проверить метод, подобный этому

@PostMapping(value = "/test")
public String test(@Valid TestModel model) {
    return model.getUsername();
}

и TestModel это

@Getter
@Setter
public class TestModel {
    private MultipartFile[] image1;
    private MultipartFile[] image2;
    private MultipartFile[] image3;
    private String username;
    private String password;
}

Я могу использовать httpclient для проверки этого, но я не думаю, что это хорошая идея, поэтому есть ли другие методы с пружинным тестом?

Ответы [ 4 ]

0 голосов
/ 19 июня 2018
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Before
public void before() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();   //构造MockMvc
}

@Test
public void test() throws Exception {
    this.mockMvc.perform(MockMvcRequestBuilders.multipart("/test")
            .file(new MockMultipartFile("image1", "filename1.txt", "text/plain", "some xml".getBytes()))
            .file(new MockMultipartFile("image1", "filename2.txt", "text/plain", "some xml".getBytes()))
            .file(new MockMultipartFile("image2", "filename3.txt", "text/plain", "some xml".getBytes()))
            .file(new MockMultipartFile("image2", "filename4.txt", "text/plain", "some xml".getBytes()))
            .file(new MockMultipartFile("image2", "filename5.txt", "text/plain", "some xml".getBytes()))
            .file(new MockMultipartFile("image1", "filename6.txt", "text/plain", "some xml".getBytes()))
            .file(new MockMultipartFile("image3", "filename7.txt", "text/plain", "some xml".getBytes()))
            .param("username", "123")
            .param("password", "123")
    ).andExpect(MockMvcResultMatchers.status().is(200));
}

}
0 голосов
/ 09 мая 2018

Если, с другой стороны, вы хотите установить быстрый модульный тест выполнения без необходимости полного запуска SpringBoot ... читайте дальше.

Использование @SpringBootTest настраивает среду полного интеграционного тестирования, которая запускает полный экземпляр SpringBoot, поэтому при активной разработке это занимает относительно много времени. Spring MockMVC приходит на помощь, поскольку он эмулирует servletContainer до такой степени, что вы можете включить любые тесты фильтрации запросов или обработки исключений в ваш набор модульных тестов.

Вы можете настроить эту настройку следующим образом:

Настройка настраиваемого контекста теста : @ContextConfiguration позволяет указать классы, необходимые для теста. Установите Mockito MockMvc, который, более того, эмулирует контейнер сервлета, и настройте свои тестовые данные и зависимости.

 @RunWith(SpringRunner.class)
@ContextConfiguration(classes = {
    WebConfig.class,
    SomeFilter.class,
    HeaderFactory.class,
})
@Slf4j
public class OrganisationCtrlTest {

    private MockMvc mvc;

    private Organisation coorg;

    @Autowired
    private SomeFilter someFilter;

    @MockBean
    private OrganisationSvc service;

    @InjectMocks
    private OrganisationCtrl controller = new OrganisationCtrl();

    //Constructor
    public OrganisationCtrlTest() {
    }
   ....

Настройка фиктивного эмулятора сервлета MVC : зарегистрировать компоненты-обработчики в контексте и создать эмулятор mockMvc (Примечание. Возможны две конфигурации: standaloneSetup или webAppContextSetup; см. Документацию ). Конструктор по праву реализует шаблон Построителя, поэтому перед вызовом build () вы можете объединить команды конфигурации для обработчиков исключений и обработчиков.

@Before
public void setUp() {
    final StaticApplicationContext appContext = new StaticApplicationContext();
    appContext.registerBeanDefinition("BusinessExceptionHandler",
            new RootBeanDefinition(BusinessExceptionHandler.class, null, null));
    appContext.registerBeanDefinition("InternalExceptionHandler",
            new RootBeanDefinition(InternalExceptionHandler.class, null,
                    null));
    MockitoAnnotations.initMocks(this);
    mvc = MockMvcBuilders.standaloneSetup(controller)
            .setHandlerExceptionResolvers(getExceptionResolver(appContext))
            .addFilters(someFilter)
            .build();
    coorg = OrganisationFixture.getFixture("orgID", "name", "webSiteUrl");
}
....

Проведите свои тесты

    @Test
    public void testGetSingleOrganisationRecordAndSuccess() throws Exception {
        System.out.println("testGetSingleOrganisationRecordAndSuccess");
        String request = "/orgs/{id}";
        log.info("Request URL: " + request);

        when(service.getOrganisation(anyString())).
                thenReturn(coorg);
        this.mvc.perform(get(request)
                .accept(VndMediaType.UNITERRA_RFV1_JSON_UTF8)
                .header("Accept-Language", "en"))
                .andExpect(content().contentType(
                        .APPLICATION_JSON_UTF8))
                .andExpect(status().isOk())
                .andExpect(content().string(containsString("org")))
                .andExpect(content().string(containsString("aName")))
                .andExpect(content().string(containsString("aUrl")))
                .andDo(print());
    }
    ....
}

Надеюсь, это поможет.

Джейк.

0 голосов
/ 02 июня 2018

С MockMvc это действительно легко. Также вы можете проверить свой ответ с JsonPath. Spring MVC предлагает автономный набор, который поддерживает тестирование относительно простых контроллеров, без необходимости контекста.

Создайте MockMvc, зарегистрировав один или несколько экземпляров @ Controller и настроив инфраструктуру Spring MVC программным способом. Это позволяет полностью контролировать создание и инициализацию контроллеров и их зависимостей, аналогично простым модульным тестам, а также позволяет тестировать один контроллер за раз.

Пример теста для вашего контроллера может быть таким простым:

public class DemoApplicationTests {

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = standaloneSetup(new HelloWorld()).build();
    }

    @Test
    public void testSayHelloWorld() throws Exception {
        this.mockMvc.perform(get("/").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
                .andExpect(status().isOk())
                .andExpect(content().contentType("application/json"));

    }
}
0 голосов
/ 09 мая 2018

Когда вы тестируете контроллеры, вы, вероятно, проводите интеграционное тестирование. Я пишу тестовые сценарии на основе Spring MVC и с загрузкой Spring, больше мощности для @AutoConfigureMockMvc

Справка: https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/testing.html#spring-mvc-test-framework

http://www.baeldung.com/spring-boot-testing

После настройки все выглядит примерно так:

@RunWith(SpringRunner.class)
@SpringBootTest(
  webEnvironment = WebEnvironment.RANDOM_PORT,
  classes = Application.class)
@AutoConfigureMockMvc
@TestPropertySource(
  locations = "classpath:test.properties")
public class ControllerTest {
 
    @Autowired
    private MockMvc mvc;

    @Test
    public void test(){
      mvc.perform(MockMvcRequestBuilders
              .post("/test")
              .contentType(MediaType.APPLICATION_JSON).content(content))
              .andExpect(status().isOk())
              .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
              .andDo(print());

    }
...