Разница между использованием MockMvc с SpringBootTest и использованием WebMvcTest

Я новичок в Spring Boot и пытаюсь понять, как работает тестирование в SpringBoot. Я немного озадачен тем, в чем разница между следующими двумя фрагментами кода:

Фрагмент кода 1:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
    @Autowired    
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

В этом тесте используется аннотация @WebMvcTest, которая, как мне кажется, предназначена для тестирования срезов функций, и она проверяет только уровень Mvc веб-приложения.

Фрагмент кода 2:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

В этом тесте используется аннотация @SpringBootTest и MockMvc. Так чем же это отличается от фрагмента кода 1? Что это делает по-другому?

Редактировать: Добавление фрагмента кода 3 (это можно найти в качестве примера интеграционного тестирования в документации Spring)

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

@LocalServerPort
private int port;

private URL base;

@Autowired
private TestRestTemplate template;

@Before
public void setUp() throws Exception {
    this.base = new URL("http://localhost:" + port + "/");
}

@Test
public void getHello() throws Exception {
    ResponseEntity<String> response = template.getForEntity(base.toString(),
            String.class);
    assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
}
}

Ответы на вопрос(3)

Ваш ответ на вопрос