Apache верблюд Junit издеваться - PullRequest
0 голосов
/ 16 мая 2018

Я пишу тестовый пример JUnit для класса Route. Я сталкиваюсь с проблемой при издевательстве ServiceClass в классе Processor.

 public class SaveRouteTest extends CamelTestSupport {
    private Exchange exchange;
    protected ProducerTemplate template;
    private SaveRequestBuilder saveRequestBuilder;
    private SaveRoute route;
    private SaveProcessor saveProcessor;
    private ApplicationContext springContext = createApplicationContext();

    @Mock
    SaveServiceClient saveServiceClient;//Not able to mock this class
    @BeforeClass
    public void prepareTestCamelContext() throws Exception {
        route = springContext.getBean("saveRoute", saveRoute.class);
        saveProcessor = springContext.getBean("saveProcessor", 
      SaveProcessor.class);
        saveRequestBuilder = springContext.getBean("saveRequestBuilder", 
         SaveRequestBuilder.class);
    }
    @BeforeMethod
    public void init() throws SQLException, ServiceException {
        MockitoAnnotations.initMocks(this);
        exchange = new DefaultExchange(context);
    }
    @Override
    protected RouteBuilder[] createRouteBuilders() throws Exception {
        template = context.createProducerTemplate();
        return new RouteBuilder[]{route};
    }
    @Test
    public void testHotelCommitTransactionRouteSuccessReturn() throws 
   Exception {    

    when(saveServiceClient.invokeServiceWithName(anyObject()).
     thenReturn("Response");
        exchange.getIn().setBody("Request detail");
        exchange = template.send("direct:SaveRoute",exchange);
    }
    protected ApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("classpath*:config/spring/testContext.xml");
    }
}

@Component
public class SaveRoute extends SPRouteBuilder {
    @Autowired
    private SaveProcessor saveProcessor;
    @Override
    public void configure() throws Exception {
        from("direct:SaveRoute")
                .routeId("save")
                .to("direct:ProcessSaveFlow")
                .end();
        from("direct:ProcessSaveFlow")
                        .process(saveProcessor)
        .end();
    }
}


public class SaveProcessor implements Processor {
    @Autowired
    SaveServiceClient saveServiceClient;
    @Override
    public void process(Exchange exchange) throws Exception {
        //This line of code not able to mock
        String response = saveServiceClient.invokeServiceWithName(exchange);
        exchange.getIn().setBody(response);
    }
}

Как разрешить насмешки saveServiceClient.invokeServiceWithName? Отладчик всегда идет внутри этого метода. Я пытался использовать как фиктивные объекты, так и инъекцию. Я не могу сделать вызов метода напрямую.

1 Ответ

0 голосов
/ 16 мая 2018

Вы создаете фиктивный объект, однако вы никуда его не вводите (обычно вы делаете это с аннотацией @InjectMocks - читайте об этом).

Я думаю, что есть несколько возможностей:

  1. Укажите объект @MockBean, который будет рассматриваться в качестве кандидата в компонент в контексте.

Существует пример кода для насмешливых компонентов.

    @RunWith ( CamelSpringRunner.class )
    @SpringBootTest
    public class RouteBuilderTest extends CamelSpringTestSupport {

    @Autowired
    private ApplicationContext applicationContext;

    @MockBean
    private ServiceClient serviceClient;

    @Override
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks( this );
        super.setUp();
    }

    @Override
    public void tearDown() {
    }

    @Test
    public void test() {

        when( serviceClient.doStuff() ).thenReturn( "mockedResponse" );
    }
    } 
  1. Создайте макет SaveProcessor и добавьте его в класс Route - вам не следует заботиться о ServiceClient, потому что вы пытаетесь слишком много тестировать. Тесты для SaveProcessor должны быть разделены, тесты для маршрута не нуждаются в этой логике.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...