Spring Data Rest и интеграционное тестирование - PullRequest
0 голосов
/ 10 июня 2018

Я пишу несколько тестов для проверки моего приложения.Я использую Spring Boot 2.0.2.

Изображение следующей ситуации со следующей сущностью

@Entity
public class Board extends BaseEntity {

    @Column(length = 128)
    @NotNull
    private String name;

    @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true, mappedBy = "board")
    private Set<Activity> activities;

    ... ...
}

и следующим хранилищем

@Repository
@RepositoryRestResource
public interface BoardRepository extends PagingAndSortingRepository<Board, Long> {}

Теперь первый шагиз теста, который я хочу сделать, это создать объект Board, поэтому мой тест начинается со следующего кода

import static org.junit.Assert.assertNotNull;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class BoardControllerRestIT {

    @Autowired
    private TestRestTemplate testRestTemplate;
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;


    @Test
    public void testBoardCreation() throws Exception {
        Board b = new Board();
        b.setName("gianni");

        String responseFromTestRestTemplate = testRestTemplate.postForObject("/crud/boards", b, String.class);
        assertNotNull(responseFromTestRestTemplate);


        ResultActions resultActions = mockMvc.perform(
                post("/crud/boards")
                        .content(objectMapper.writeValueAsString(b))
                        .contentType(MediaType.APPLICATION_JSON));
        resultActions.andExpect(MockMvcResultMatchers.status().is2xxSuccessful());
        resultActions.andDo(mvcResult -> {
            String responseFromMockMvc = mvcResult.getResponse().getContentAsString();
        });
    }
}

Проблема в том, что переменная responseFromTestRestTemplate заполнена обычным ответом покоя данных пружины.Вместо этого внутри переменной responseFromMockMvc тело пусто.

Я хочу использовать решение mockMvc только потому, что оно более эффективно с точки зрения тестов, но без тела невозможно продолжить.Подход с testRestTemplate был лишь попыткой понять, что происходит.

Что я делаю не так?Спасибо

1 Ответ

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

Я предполагаю, что то, что ваш контроллер делает или ограничивает вашу сущность, не позволяет вам дважды создать один и тот же объект.

Попробуйте следующие изменения:

Вместо:

Board b = new Board();
b.setName("gianni");

String responseFromTestRestTemplate = testRestTemplate.postForObject("/crud/boards", b, String.class);

Do:

Board b = new Board();
b.setName("gianni");

String responseFromTestRestTemplate = objectMapper.writeValueAsString(b);

То, как вы звоните POST /crud/boards только один раз, и это через mockMvc.

...