У меня проблема с приложением. Я использую SpringBoot и Apache CXF для создания конечных точек REST. Работает очень хорошо!
Однако я сталкиваюсь с проблемой, когда хочу выполнить свои модульные тесты с JUnit. У меня проблемы с несовместимостью между Apache CXF и Springboot.
Это касается только модульного тестирования контроллеров REST (@RestController), я могу тестировать сервисы без проблем.
Я попробовал несколько способов исправить мою проблему
- Я следовал шаг за шагом это приложение https://github.com/jonashackt/soap-spring-boot-cxf
- Я смотрел довольно много похожих вопросов на StackOverflow
CXFConfig
@Configuration
public class CXFConfig {
@Autowired
private Bus bus;
@Bean
public Server rsServer() {
final JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
endpoint.setProvider(new JacksonJsonProvider());
endpoint.setBus(bus);
endpoint.setAddress("/");
endpoint.setServiceBeans(Arrays.<Object>asList(ProductsController()));
return endpoint.create();
}
@Bean
public ProductsController productController() {
return new ProductsController();
}
@Bean
public ServletRegistrationBean cxfServlet() {
final ServletRegistrationBean servletRegistrationBean =
new ServletRegistrationBean(new CXFServlet(), "/*");
servletRegistrationBean.setLoadOnStartup(1);
return servletRegistrationBean;
}
}
Остаток контроллера, который я хотел бы проверить:
@RestController
public class ProductsController implements Products {
@Autowired
ProductService productService;
@Override
public PostProductsResponse postProducts(Product entity) {
//BUISNESS PROCESS NOT SHOW HERE BUT WORKING
return PostProductsResponse.respond201WithApplicationJson(productImpl);
}
Тест JUnit ProductsControllerTest
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ProductsController.class)
@Import(CXFConfig.class)
public class ProductsControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
ProductServiceImpl productService;
private ProductServiceImpl productServiceInit(){
ProductServiceImpl product = new Product();
product.setName("Product A");
return product;
}
@Test
public void shouldReturnProductInstantiatedWith201() {
//Given
Product product = this.productServiceInit();
//When
MvcResult result = mockMvc
.perform(MockMvcRequestBuilders
.post("/products")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(product.toString())
)
.andReturn();
//Then
Assert.assertEquals(result.getHeaders(), Products.PostProductsResponse.headersFor201());
}
}
Ошибка, которую я получаю, ниже. Результат, который я хотел бы - это успешный тест.
APPLICATION FAILED TO START
***************************
Description:
Field bus in pacis1.gmop.components.auxiliary.rqp.manager_service.rest.CXFConfig required a bean of type 'org.apache.cxf.Bus' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.apache.cxf.Bus' in your configuration.