Ответ 1
В этой документации есть хорошая глава, я предлагаю вам прочитать ее, чтобы полностью понять, что вы можете сделать.
Мне нравится использовать @IntegrationTest
с настраиваемой конфигурацией, так как он запускает весь сервер и позволяет протестировать полную систему. Если вы хотите заменить некоторые части системы на mocks, вы можете сделать это, исключив определенные конфигурации или beans и заменив их на свой собственный.
Вот небольшой пример. Я оставил интерфейс MessageService
, потому что он явно отличается от IndexController
тем, что он делает, и его реализация по умолчанию - DefaultMessageService
- потому что это не актуально.
Что он делает, так это то, что он закручивает все приложение за вычетом DefaultMessageService
, но с его собственным MessageService
. Затем он использует RestTemplate
для выдачи реальных HTTP-запросов к запущенному приложению в тестовом случае.
Классы приложений:
IntegrationTestDemo.java:
@SpringBootApplication
public class IntegrationTestDemo {
public static void main(String[] args) {
SpringApplication.run(IntegrationTestDemo.class, args);
}
}
IndexController.java:
@RestController
public class IndexController {
@Autowired
MessageService messageService;
@RequestMapping("/")
String getMessage() {
return messageService.getMessage();
}
}
Тестовые классы:
IntegrationTestDemoTest.java:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfig.class)
@WebIntegrationTest // This will start the server on a random port
public class IntegrationTestDemoTest {
// This will hold the port number the server was started on
@Value("${local.server.port}")
int port;
final RestTemplate template = new RestTemplate();
@Test
public void testGetMessage() {
String message = template.getForObject("http://localhost:" + port + "/", String.class);
Assert.assertEquals("This is a test message", message);
}
}
TestConfig.java:
@SpringBootApplication
@ComponentScan(
excludeFilters = {
// Exclude the default message service
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DefaultMessageService.class),
// Exclude the default boot application or it's
// @ComponentScan will pull in the default message service
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = IntegrationTestDemo.class)
}
)
public class TestConfig {
@Bean
// Define our own test message service
MessageService mockMessageService() {
return new MessageService() {
@Override
public String getMessage() {
return "This is a test message";
}
};
}
}