Как вернуть значение из взаимодействия

У меня есть класс взаимодействия со сценарием, который делает выбор из базы данных postgres. Я хотел бы знать, как вернуть набор результатов, используя этот шаблон сценария.

То, что я пробовал сейчас, - это изменение возвращаемого типа в методе "public void PerformAs(Tactor)" на "public ResultSet PerformAs(Tactor)"

Но тогда у меня следующие проблемы:

Error:(12, 8) java: jarv.serenity.carnival.interactions.dbRelated.SelectDataBase is not abstract and does not override abstract method <T>performAs(T) in net.serenitybdd.screenplay.Performable
Error:(23, 40) java: <T>performAs(T) in jarv.serenity.carnival.interactions.dbRelated.SelectDataBase cannot implement <T>performAs(T) in net.serenitybdd.screenplay.Performable
  return type java.sql.ResultSet is not compatible with void
Error:(21, 5) java: method does not override or implement a method from a supertype

Это файл класса

package jarv.serenity.carnival.interactions.dbRelated;

import jarv.serenity.carnival.dataBaseConection.DataBaseDriver;
import jarv.serenity.carnival.model.Users;
import net.serenitybdd.screenplay.Actor;
import net.serenitybdd.screenplay.Interaction;
import net.thucydides.core.annotations.Step;
import java.sql.ResultSet;
import java.sql.Statement;
import static net.serenitybdd.screenplay.Tasks.instrumented;

public class SelectDataBase implements Interaction {

    private final DataBaseDriver dbDriver;
    private ResultSet rs=null;

    public SelectDataBase(DataBaseDriver dbDriver) {
        this.dbDriver = dbDriver;
    }

    @Override
    @Step("Selecting from DB")
    public <T extends Actor> void performAs(T actor) {
        try
        {
            Statement st = dbDriver.getConn().createStatement();
            rs = st.executeQuery("SELECT * From users");
            dbDriver.disconect();
        }
        catch(Exception e)
        {
            dbDriver.disconect();
            System.out.println(e);
        }
    }

    public ResultSet getResults(){
        return rs;
    }

    public static Interaction select(DataBaseDriver dbDriver) {
        return instrumented(SelectDataBase.class, dbDriver);
    }

    @Override
    public String toString() {
        return rs.toString();
    }
}

Прямо сейчас я могу выполнить операцию выбора, но не получить набор результатов.

Я хотел бы иметь возможность получить его или вернуть его к любой задаче или вопросам, которые используют это взаимодействие


person Jarvcol    schedule 02.02.2019    source источник


Ответы (1)


В шаблоне «Сценарий» взаимодействия не предназначены для возврата значений, а предназначены только для выполнения некоторых действий в тестируемой системе. Вы используете вопросы для запроса состояния системы. Было бы проще, если бы вы поделились общей проблемой, которую пытаетесь решить, но, поскольку ваш пример касается запроса пользователей, у вас может быть тест, который проверяет, что вы можете добавить пользователя в систему через страницу администрирования пользовательского интерфейса:

@Test
public void add_a_user_to_the_system() {

    Actor ada = Actor.named("Ada").describedAs("an admin");

    when(ada).attemptsTo(
            AddANewUser.called("Jack")
    );

    then(ada).should(
            seeThat(KnownUsers.inTheSystem(),
                    contains(hasProperty("name", equalTo(("Jack"))))
            )
    );
}

(Вероятно, в этом случае было бы более эффективно искать пользователя по имени, но я хотел, чтобы это было близко к вашему примеру).

Для этого у вас может быть класс AddANewUser, который использует экраны администратора для добавления нового пользователя:

class AddANewUser implements Performable {

    public static Performable called(String userName) {
        return instrumented(AddANewUser.class, userName);
    }

    private final String userName;

    AddANewUser(String userName) {
        this.userName = userName;
    }

    @Override
    public <T extends Actor> void performAs(T actor) {
        // Add a new user called userName via the UI
    }
}

Затем вы должны проверить, что этот пользователь существует, используя вопрос:

@Subject("known users")
static class KnownUsers implements Question<List<ApplicationUser>> {

  public static KnownUsers inTheSystem() { return new KnownUsers(); }

  @Override
  public List<ApplicationUser> answeredBy(Actor actor) {
      // Query the database and convert the result set to ApplicationUsers
      return ...;
  }
}

Вы также можете создать класс Ability для централизации запросов JDBC, учетных данных и т. д.

person John Smart    schedule 03.02.2019
comment
Спасибо @John Smart ... да, позже я заметил, что с помощью вопроса я могу проверить состояние таблицы БД. В этом случае меня просто попросили использовать шаблон сценария для простых операций с БД (выбрать, вставить, обновить, удалить), и я искал вариант, обеспечивающий выполнение удаления, вставки или чего-то еще... я думаю Мне нужен такой вопрос, как userExists, чтобы проверить, действительно ли он был удален или вставлен. Я буду продолжать работать над ним как над самообучающимся практическим проектом. Еще раз спасибо!! - person Jarvcol; 06.02.2019