Не могу запустить мой тест с Apache CXF и SpringBoot - PullRequest
0 голосов
/ 03 июля 2019

У меня проблема с приложением. Я использую 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.
...