Платформа Citrus: Как сделать, чтобы soap ответ / цитрусовая переменная / функция цитруса возвращала результат, доступный для java - PullRequest
1 голос
/ 05 марта 2020

Я использую Citrus 2.7.8 с Cucumber 2.4.0. Я делаю вызов soap и хочу получить ответ и выполнить его расширенный анализ, чтобы проверить, есть ли у ответа graphql совпадающие значения. (Я понимаю, как выполнять валидацию, когда в ней есть только один элемент, но мне нужно что-то, что можно обработать, когда может быть возвращен один или несколько элементов (например, 1 транспортное средство или 4 транспортных средства)). Чтобы сделать мою проверку очень динамичной c и способной обрабатывать много разных «кавычек», я хочу сохранить ответ в переменной Citrus, а затем сделать его доступным для java для чтения в файле и выполнения расширенного анализа и проверки ,

Внедрение TestContext в настоящее время не работает с огурцом (см. https://github.com/citrusframework/citrus/issues/657), поэтому я использую обходной путь здесь: Как добавить TestContext с помощью TestRunner и cucumber чтобы вручную создать контекст. Без этого я получаю nullpointerexception для всего, что связано с контекстом.

Я могу использовать функцию сообщений Citrus, чтобы получить ответ soap, который является потрясающим. Мои операторы echo в консоли показывают, что она успешно поместила правильное значение в переменную citrus. Но у меня возникают проблемы с тем, чтобы сделать это доступным для java, чтобы я мог затем открыть его и проанализировать.

Я сократил файл определения шага до подходящего кода. Мои попытки пары перечислены ниже вместе с проблемами, с которыми я столкнулся в их результатах.

Есть ли у кого-нибудь идеи о том, как я могу успешно обойти проблемы контекста и сделать свой ответ доступным для java?

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;

import com.consol.citrus.Citrus;
import com.consol.citrus.annotations.CitrusFramework;
import com.consol.citrus.annotations.CitrusResource;
import com.consol.citrus.config.CitrusSpringConfig;
import com.consol.citrus.context.TestContext;

import com.consol.citrus.dsl.junit.JUnit4CitrusTestRunner;
import com.consol.citrus.dsl.runner.TestRunner;
import com.consol.citrus.ws.client.WebServiceClient;

import cucumber.api.java.en.When;

@ContextConfiguration(classes = CitrusSpringConfig.class)
public class CitrusSteps extends JUnit4CitrusTestRunner {
    @CitrusFramework
    private Citrus citrus;

    @CitrusResource
    private TestRunner runner;

    @CitrusResource
    private TestContext context;

    @Autowired
    private WebServiceClient getQuote;

    @When("^I call getQuote with id \"([^\"]*)\"$")
    public void i_call_getquote_with_id(String quoteId) throws Throwable {
        context = citrus.createTestContext();

        String soappayload = "my payload (taken out for privacy purposes)";

        runner.soap(action -> action.client(getQuote)
                .send()
                .soapAction("getQuote")
                .payload(soappayload));

        runner.soap(action -> action.client(getQuote)
        .receive()
        .name("getQuoteResponseStoredMessage"));        

        //this bombs out on the context line with this: "com.consol.citrus.exceptions.CitrusRuntimeException: Unknown variable 'messageStoreGetQuoteResponse1'"
        runner.variable("messageStoreGetQuoteResponse1", "citrus:message(getQuoteResponseStoredMessage.payload())");
        runner.echo("First try: ${messageStoreGetQuoteResponse1}");
        String firstTry = context.getVariable("messageStoreGetQuoteResponse1");
        log.info("First Try java variable: " + firstTry);

        //this bombs out on the context line with this: "com.consol.citrus.exceptions.CitrusRuntimeException: Unknown variable 'messageStoreGetQuoteResponse2'"
        runner.createVariable("messageStoreGetQuoteResponse2", "citrus:message(getQuoteResponseStoredMessage.payload())");
        runner.echo("Second try: ${messageStoreGetQuoteResponse2}");
        String secondTry = context.getVariable("messageStoreGetQuoteResponse2");
        log.info("Second Try java variable: " + secondTry);

        //This stores the literal as the value - it doesn't store the message so it appears I can't use citrus functions within the context
        context.setVariable("messageStoreGetQuoteResponse3", "citrus:message(getQuoteResponseStoredMessage.payload())");
        String thirdTry = context.getVariable("messageStoreGetQuoteResponse3");
        log.info("Third Try java variable: " + thirdTry);

    }

}

1 Ответ

1 голос
/ 05 марта 2020

Умный сотрудник нашел обходной путь для инъекции, не работающей с огурцом.

Я заменил эти две строки:

@CitrusResource
private TestContext context;

на эти строки вместо:

TestContext testContext;
public TestContext getTestContext() {
    if (testContext == null) {
        runner.run(new AbstractTestAction() {
            @Override
            public void doExecute(TestContext context) {
                testContext = context;
            }
        });
    }
    return testContext;
}

Тогда на моем шаге, где я хочу контекст, я могу использовать вышеуказанный метод. В моем случае я хотел получить ответ на сообщение, поэтому смог использовать его и подтвердить, что ответ теперь находится в моей переменной java:

String responseXML = getTestContext().getMessageStore().getMessage("getQuoteResponseStoredMessage").getPayload(String.class);
log.info("Show response XML: " + responseXML);
...