Citrus framework: как сделать ответ мыла/переменную цитруса/функцию цитруса возвращаемым результатом, доступным для java

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

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

Я могу использовать функцию сообщения 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);

    }

}

person MPleas    schedule 05.03.2020    source источник


Ответы (1)


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

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

@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);
person MPleas    schedule 05.03.2020