gpt4 book ai didi

java - Apache Camel Junit 模拟问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:04 27 4
gpt4 key购买 nike

我正在为 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 的模拟?调试器总是进入这个方法。我尝试同时使用模拟对象和注入(inject)的模拟。我无法直接调用方法。

最佳答案

你正在创建一个模拟对象,但是你没有将它注入(inject)到任何地方(通常你是用 @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 并将其注入(inject) Route 类 - 你不应该关心 ServiceClient,因为你试图测试太多。 SaveProcessor 的测试应该分开,route 的测试不需要这个逻辑。

关于java - Apache Camel Junit 模拟问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359331/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com