如何 return 来自交互的值
How to return a value from an Interaction
我有一个剧本互动 class 从 postgres 数据库制作 select。我想知道如何 return 使用此剧本模式的结果集。
我现在尝试的是将方法 "public void performAs(T actor)" 上的 returned 类型更改为 "public ResultSet performAs(T actor)"
但是我遇到了以下问题:
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
这是 class 文件
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();
}
}
现在我可以执行 select 操作但不能检索结果集。
我希望能够检索它或让它return用于任何使用此交互的任务或问题
在 Screenplay 模式中,交互并不意味着 return 值,只是为了在被测系统上执行一些操作。您使用问题查询系统的状态。如果您分享您要解决的整体问题会更容易,但由于您的示例是关于查询用户的,因此您可以进行测试以检查您是否可以通过 UI 管理页面将用户添加到系统:
@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,它使用管理屏幕添加新用户:
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 ...;
}
}
您还可以创建能力 class 来集中 JDBC 查询、凭据等
我有一个剧本互动 class 从 postgres 数据库制作 select。我想知道如何 return 使用此剧本模式的结果集。
我现在尝试的是将方法 "public void performAs(T actor)" 上的 returned 类型更改为 "public ResultSet performAs(T actor)"
但是我遇到了以下问题:
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
这是 class 文件
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();
}
}
现在我可以执行 select 操作但不能检索结果集。
我希望能够检索它或让它return用于任何使用此交互的任务或问题
在 Screenplay 模式中,交互并不意味着 return 值,只是为了在被测系统上执行一些操作。您使用问题查询系统的状态。如果您分享您要解决的整体问题会更容易,但由于您的示例是关于查询用户的,因此您可以进行测试以检查您是否可以通过 UI 管理页面将用户添加到系统:
@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,它使用管理屏幕添加新用户:
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 ...;
}
}
您还可以创建能力 class 来集中 JDBC 查询、凭据等