【问题标题】:Apache camel Junit mock issueApache骆驼Junit模拟问题
【发布时间】:2018-05-15 21:21:30
【问题描述】:

我正在为 Route 类编写 JUnit 测试用例。在 Processor 类中模拟 ServiceClass 时遇到问题。

 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 的嘲笑问题?调试器总是在这个方法里面。我尝试同时使用模拟对象和注入的模拟。无法直接调用方法。

【问题讨论】:

    标签: java apache-camel mockito junit4 spy


    【解决方案1】:

    您正在创建一个模拟对象,但是您并没有在任何地方注入它(通常您是使用 @InjectMocks 注释来做的 - 阅读它)。

    我认为有几种可能:

    1. 提供一个@MockBean 对象,该对象将在上下文中被视为候选bean。

    有一个模拟 bean 的代码示例。

        @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 的测试应该分开,路由的测试不需要这个逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多