Простой способ получения дополнительных компонентов в контексте - использование вложенных классов конфигурации в тестовых классах
@TestConfiguration
static class AdditionalConfig {
@Bean
public SomeBean getSomeBean() {
return new SomeBean());
}
}
Пример:
Сценарий - если у вас есть какой-нибудь контроллер, скажем ProductController , и у вас есть соответствующий слайс-тест для класса, скажем ProductionControllerTest
@RestController
public class ProductController {
@Autowired
private IProductService productService;
@Autowired
private IProductValidator productValidator;
@GetMapping("product")
public Product getProduct(@RequestParam Long id) {
Product product = productService.getProduct(id); // you are using mockBean of productService
productValidator.validateProduct(product); // you need real bean of productValidator
return product;
}
}
Соответствующий класс слайд-теста с дополнительной конфигурацией компонента
@RunWith(SpringRunner.class)
@WebMvcTest
public class ProductControllerSliceTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private IProductService productService;
@Autowired
private ApplicationContext applicationContext;
@TestConfiguration
static class AdditionalConfig {
@Bean
public IProductValidator productValidator() {
return new ProductValidator();
}
}
@Test
public void testProductGetById() throws Exception {
Product testProductWithID1L = new Product(1L, "testProduct");
when(productService.getProduct(anyLong())).thenReturn(testProductWithID1L);
mockMvc.perform(get("/product")
.param("id", "1")).andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("name")
.value("testProduct"))
.andExpect(MockMvcResultMatchers.jsonPath("id")
.value("1"));
}
}
Дополнительные соображения относительно вашего сценария: Если вы действительно намереваетесь выполнить модульное тестирование класса контроллера, то в идеале вам следует смоделировать все дополнительные зависимости класса, который вы тестируете.
В идеале, целью модульного теста является только проверка поведения тестируемого объекта / класса. Все поведение зависимых классов или внешние вызовы должны быть посмешищем.
Когда вы начинаете тестировать несколько классов вместе в рамках одного теста, вы все больше переходите к компонентному тесту или интеграционному тесту