无法获得柑橘TestContext对象,而TestNg框架工作执行Citrus测试用例

时间:2018-03-27 10:00:03

标签: java testng citrus-framework

我正在使用TestNg框架工作来执行柑橘框架工作测试用例。在下面的代码中,我无法在执行测试用例时获得柑橘文本上下文对象错误

import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.consol.citrus.annotations.CitrusResource;
import com.consol.citrus.annotations.CitrusXmlTest;
import com.consol.citrus.context.TestContext;
import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;
public class GenricTest extends TestNGCitrusTestRunner {
    static 
    {
      System.setProperty("citrus.spring.application.context", "file:G:\\Citrus\\citrus-context.xml");
    }
     @Test @Parameters("context")
    @CitrusXmlTest(packageScan = "file:C:\\xitrus")

    public void CitrusTest(@Optional @CitrusResource TestContext context) 
    {

    }
}

执行上面的代码以获取柑橘文本上下文对象时我得到了以下错误

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Unsupported type parameter : class com.consol.citrus.context.TestContext
    at org.testng.internal.Parameters.convertType(Parameters.java:318)
    at org.testng.internal.Parameters.createParameters(Parameters.java:203)
    at org.testng.internal.Parameters.createParameters(Parameters.java:443)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:569)
    at org.testng.internal.Invoker.handleParameters(Invoker.java:1308)
    at org.testng.internal.Invoker.createParameters(Invoker.java:1036)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1126)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

1 个答案:

答案 0 :(得分:0)

我不知道你在Citrus环境中配置了什么,所以我将发布一个完整的例子。

Citrus测试使用TestNG运行,但Citrus本身是Spring应用程序。这意味着您可以像在Spring应用程序中那样在配置类中配置Beans,然后您可以使用@Autowired来访问测试中的bean。

这是一个示例配置类,我在其中配置了测试所需的bean:

@Import({})// you can import more configuration classes here
public class CitrusConfiguration {

    @Value("${inbound.service.url}")
    private String serviceUrl;
    @Value("${external.api.mock.port}")
    private int externalApiMockPort;

    @Bean
    public HttpClient inboundClient() {
        return CitrusEndpoints.http()
                .client()
                .requestUrl("http://" + serviceUrl)
                .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .build();
    }

    @Bean
    public HttpServer externalApiMock() {
        return CitrusEndpoints.http()
                .server()
                .port(externalApiMockPort)
                .autoStart(true)
                .timeout(10000)
                .build();
    }
}

在此之后,我们需要告诉Citrus哪个类是属性文件中的主要配置类,如下所示:src/test/resources/citrus-application.properties

citrus.spring.java.config=<your.package>.CitrusConfiguration

现在我们可以写一个这样的测试:

@Test
public class InboundApiControllerIT extends TestNGCitrusTestRunner {

    @Autowired
    private HttpClient httpClient;

    @CitrusTest
    public void okTest() {

        http(action -> action.client(httpClient)
                .send()
                .post("/inbound")
                .payload("{" +
                        "\"userName\": \"Bruce.Wayne\"," +
                        "\"operation\": \"call-a-pizza\"" +
                        "}"));

        http(action -> action.client(httpClient)
                .receive()
                .response(HttpStatus.OK)
                .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .payload("{" +
                        "\"success\": true" +
                        "}"));
    }
}

请不要使用static块来配置Citrus(或一般的任何东西)并使用如上所述的设置。如果documentation无法帮助您,您可以随时查看样本here

Citrus测试组件在测试中非常灵活,因此您不需要动态更改任何配置值。我也不建议这样做。如果您需要更改无法在测试操作中显式配置的测试组件(如HttpClient)内的任何内容,那么我建议您使用该特殊配置创建一个新组件。