java - 在 TestNg 框架执行 Citrus 测试用例时无法获取 citrus TestContext 对象

标签 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)

最佳答案

我不知道您在 Citrus 上下文中配置了什么,因此我将发布一个完整的示例。

Citrus 测试是使用 TestNG 运行的,但 Citrus 本身是一个 Spring 应用程序。这意味着您可以像在 Spring 应用程序中一样在配置类中配置 Bean,然后可以使用 @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 block 来配置 Citrus(或任何一般内容)并使用如上所述的设置。如果documentation无法帮助您,您可以随时查看 sample here .

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

关于java - 在 TestNg 框架执行 Citrus 测试用例时无法获取 citrus TestContext 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49509872/

相关文章:

java - 如何按前 3 位对 ArrayList 中的邮政编码列表进行排序?

java - 使用大量 getter 和 setter 高效填充 POJO

java - 查找括号是否正确嵌套/对齐 JAVA

java - 错误无法找到或加载主类org.testng.TestNG

java - 使继承的 getter 返回模拟对象

java - Citrus 框架 - 无法成功构建示例

java - 这个对象的动态类型是什么?

java - 哪些插件用于在 Google Chrome 浏览器中查找定位器?

java - Citrus 示例 TCP 发送和接收失败

java - 诱惑报告: Failed test written with Citrus displayed as ‘Broken’