JAXB - маршалинг и демаршалинг вложенных пользовательских объектов - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь проанализировать сгенерированный .xml отчет из ReadyAPI с помощью демаршаллинга, но у меня возникают проблемы при создании классов. Мой пример гораздо сложнее, чем большинство исследований, которые я проводил в Интернете, поэтому мне сложно их сравнивать. Может ли кто-нибудь помочь мне построить структуру объекта для чего-то подобного?

Example.xml

<testSuiteResults>
  <testSuite>
    <startTime>00:00:00</startTime>
    <status>PASS</status>
    <testSuiteName>Example Test Suite Name</testSuiteName>
    <timeTaken>246</timeTaken>
    <testRunnerResults>
      <testCase>
        <startTime>00:00:00</startTime>
        <status>PASS</status>
        <testCaseId>111aaa111aaa111aaa111</testCaseId>
        <testCaseName>Example TestCase Name</testCaseName>
        <timeTaken>123</timeTaken>
        <testStepResults>
          <result>
            <message>Example Message</message>
            <name>Example Result Name</name>
            <order>1</order>
            <started>00:00:00</started>
            <status>PASS</status>
            <timeTaken>123</timeTaken>
          </result>
        </testStepResults>
        <testStepParameters>
          <parameters>
            <iconPath>/icon_path.png</iconPath>
            <testStepName>Example Test</testStepName>
          </parameters>
        </testStepParameters>
        </failedTestSteps>
      </testCase>
      <testCase>
        <reason>Example Fail Reason</reason>
        <startTime>00:00:00</startTime>
        <status>FAIL</status>
        <testCaseId>123abc123abc123abc123</testCaseId>
        <testCaseName>Example Test Case Name 2</testCaseName>
        <timeTaken>123</timeTaken>
        <testStepResults>
          <result>
            <message>Example Message 2</message>
            <name>Example Test Step Name 2</name>
            <order>1</order>
            <started>00:00:00</started>
            <status>FAIL</status>
            <timeTaken>123</timeTaken>
          </result>
        </testStepResults>
        <testStepParameters>
          <parameters>
            <iconPath>/icon_path_2.png</iconPath>
            <testStepName>Example Test Step Name 2</testStepName>
          </parameters>
        </testStepParameters>
        <failedTestSteps>
          <error>
            <detail>Example Detail</detail>
            <icon>icon.png</icon>
            <testCaseName>Example Test Case Name 2</testCaseName>
            <testStepName>Example Test Step Name 2</testStepName>
            <testSuiteName>Example Test Suite Name</testSuiteName>
          </error>
        </failedTestSteps>
      </testCase>
    </testRunnerResults>
  </testSuite>
</testSuiteResults>

После многих итераций я попал на эту структуру:

@XmlRootElement(name = "testSuiteResults")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestSuiteResults {
    @XmlElement(name = "testSuite")
    private List<TestSuite> testSuites;

    public void setTestSuites(List<TestSuite> testSuites) {
        this.testSuites = testSuites;
    }

    public List<TestSuite> getTestSuites() {
        return this.testSuites;
    }

    public boolean hasTestSuites() {
        return this.testSuites != null && this.testSuites.size() > 0;
    }
}

@XmlRootElement(name = "testSuite")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestSuite {
    @XmlElement(name = "startTime")
    private String startTime;
    @XmlElement(name = "status")
    private String status;
    @XmlElement(name = "testSuiteName")
    private String testSuiteName;
    @XmlElement(name = "timeTaken")
    private String timeTaken;
    @XmlElementWrapper(name = "testRunnerResults")
    @XmlElement(name = "testCase", type = TestCase.class)
    private List<TestCase> testRunnerResults;

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTestSuiteName(String testSuiteName) {
        this.testSuiteName = testSuiteName;
    }

    public void setTimeTaken(String timeTaken) {
        this.timeTaken = timeTaken;
    }

    public void setTestRunnerResults(List<TestCase> testRunnerResults) {
        this.testRunnerResults = testRunnerResults;
    }

    public String getTestSuitename() {
        return this.testSuiteName;
    }

    public List<TestCase> getTestCases() {
        return this.testRunnerResults;
    }

    public boolean hasTestCases() {
        return this.testRunnerResults != null;
    }
}

@XmlRootElement(name = "testCase")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestCase {
    @XmlElement(name = "reason")
    private String reason;
    @XmlElement(name = "startTime")
    private String startTime;
    @XmlElement(name = "status")
    private String status;
    @XmlElement(name = "testCaseId")
    private String testCaseId;
    @XmlElement(name = "testCaseName")
    private String testCaseName;
    @XmlElement(name = "timeTaken")
    private String timeTaken;
    @XmlElementWrapper(name = "testStepResults")
    @XmlElement(name = "result")
    private List<TestStepResult> testStepResults;
    @XmlElementWrapper(name = "testStepParameters")
    @XmlElement(name = "parameters")
    private List<TestStepParameter> testStepParameters;
    @XmlElementWrapper(name = "failedTestSteps")
    @XmlElement(name = "error")
    private List<TestStepError> failedTestSteps;

    public void setReason(String reason) {
        this.reason = reason;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTestCaseId(String testCaseId) {
        this.testCaseId = testCaseId;
    }

    public void setTestCaseName(String testCaseName) {
        this.testCaseName = testCaseName;
    }

    public void setTimeTaken(String timeTaken) {
        this.timeTaken = timeTaken;
    }

    public void setTestStepResults(List<TestStepResult> testStepResults) {
        this.testStepResults = testStepResults;
    }

    public void setTestStepParameters(List<TestStepParameter> testStepParameters) {
        this.testStepParameters = testStepParameters;
    }

    public void setFailedTestSteps(List<TestStepError> failedTestSteps) {
        this.failedTestSteps = failedTestSteps;
    }

    public String getReason() {
        return this.reason;
    }

    public String getStartTime() {
        return this.startTime;
    }

    public String getStatus() {
        return this.status;
    }

    public String getTestCaseId() {
        return this.testCaseId;
    }

    public String getTestCaseName() {
        return this.testCaseName;
    }

    public String getTimeTaken() {
        return this.timeTaken;
    }

    public List<TestStepResult> getTestStepResults() {
        return this.testStepResults;
    }

    public List<TestStepParameter> getTestStepParameters() {
        return this.testStepParameters;
    }

    public List<TestStepError> getFailedTestSteps() {
        return this.failedTestSteps;
    }
}

@XmlRootElement(name = "result")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestStepResult {
    @XmlElement(name = "message")
    private String message;
    @XmlElement(name = "name")
    private String testStepName;
    @XmlElement(name = "order")
    private int order;
    @XmlElement(name = "started")
    private String started;
    @XmlElement(name = "status")
    private String status;
    @XmlElement(name = "timeTaken")
    private String timeTaken;

    public void setMessage(String message) {
        this.message = message;
    }

    public void setTestStepName(String testStepName) {
        this.testStepName = testStepName;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    public void setStarted(String started) {
        this.started = started;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTimeTaken(String timeTaken) {
        this.timeTaken = timeTaken;
    }

    public String getTestStepName() {
        return this.testStepName;
    }
}

@XmlRootElement(name = "paramters")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestStepParameter {
    @XmlElement(name = "iconPath")
    private String iconPath;
    @XmlElement(name = "testStepName")
    private String testStepName;

    public void setIconPath(String iconPath) {
        this.iconPath = iconPath;
    }

    public void setTestStepName(String testStepName) {
        this.testStepName = testStepName;
    }

    public String getTestStepName() {
        return this.testStepName;
    }
}

@XmlRootElement(name = "error")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestStepError {
    @XmlElement(name = "detail")
    private String detail;
    @XmlElement(name = "icon")
    private String icon;
    @XmlElement(name = "testCaseName")
    private String testCaseName;
    @XmlElement(name = "testStepName")
    private String testStepName;
    @XmlElement(name = "testSuiteName")
    private String testSuiteName;

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public void setTestCaseName(String testCaseName) {
        this.testCaseName = testCaseName;
    }

    public void setTestStepName(String testStepName) {
        this.testStepName = testStepName;
    }

    public void setTestSuiteName(String testSuiteName) {
        this.testSuiteName = testSuiteName;
    }
}

Пример.xml - это то, как генерируется отчет, я начал пытаться составить его самостоятельно, используя образцы данных, чтобы подтвердить, что я строю это правильно. Я смог получить этот ответ:

<testSuiteResults>
    <testSuite>
        <startTime>00:00:00</startTime>
        <status>PASS</status>
        <testSuiteName>TestSuiteName</testSuiteName>
        <timeTaken>123</timeTaken>
        <testRunnerResults/>
    </testSuite>
</testSuiteResults>

Он всегда останавливается при заполнении testRunnerResults, поэтому я попытался изучить XmlAdapters, но у меня было много проблем с пониманием того, как встраивать его в эту структуру.

...