gpt4 book ai didi

java - JOOQ MockDataProvider - 如何根据某些条件返回不同的模拟?

转载 作者:行者123 更新时间:2023-11-30 08:46:26 25 4
gpt4 key购买 nike

最近我正在使用 JOOQ MockDataProvider 实现单元测试。当我想在 DAO 中使用我的模拟提供者进行许多选择时,我不得不使用许多 if-else 语句。

根据:http://www.jooq.org/doc/latest/manual/tools/jdbc-mocking ,我只需要检查我的 SQL 是否以某个查询开头。我在 DAO 中使用的 SQL 可以以 3 种不同的方式开始,所以我使用了非常复杂的 if-else 结构。

第二件事——我希望我的 MockDataProvider 仅在第一次执行 SQL 时返回一些模拟结果,然后不返回任何结果——在 DAO 中循环迭代 5 次,每次我的 DAO 都应该检查一些东西数据库。我不知道如何模拟这种行为,所以我使用了简单的计数器——但它看起来很糟糕,我希望它能以一种好的方式实现。这是我的代码:

public class SomeProvider implements MockDataProvider {

private static final String STATEMENT_NOT_SUPPORTED_ = "Statement not supported: ";
private static final String SELECT_META = "select \"myschema\".\"meta\".";
private static final String SELECT_CLIENT = "select \"myschema\".\"client\".";
private static final String SELECT_KEY = "select \"myschema\".\"key\".";
private static final String TEST_SECRET_KEY = "some key";
private static final String KEY = "40sld";
private static final String DROP = "DROP";
private static final String SOME_URL = "something";
private static final String MONKEY = "monkey";
private static final int FIRST_ITERARION_COUNTER_VALUE = 0;
private final Long keyId;
int counter = 0;

public SomeProvider(Long keyId) {
this.keyId = keyId;
}

@Override
public MockResult[] execute(MockExecuteContext ctx) throws SQLException {

DSLContext create = DSL.using(SQLDialect.POSTGRES);
MockResult[] mock = new MockResult[3];
String sql = ctx.sql();
if (sql.toUpperCase().startsWith(DROP)) {
throw new SQLException(STATEMENT_NOT_SUPPORTED_ + sql);
} else if (sql.startsWith(SELECT_CLIENT)) {

Result<ClientRecord> result = create.newResult(CLIENT);
result.add(create.newRecord(CLIENT));
result.get(0).setValue(CLIENT.ID, 1L);
result.get(0).setValue(CLIENT.SECRET_KEY, TEST_SECRET_KEY);
mock[0] = new MockResult(1, result);

} else if (sql.startsWith(SELECT_META)) {

Result<MetaRecord> metaResult = create.newResult(META);
metaResult.add(create.newRecord(META));
metaResult.get(0).setValue(META.ID, 1L);

metaResult.get(0).setValue(META.URL, SOME_URL);
metaResult.get(0).setValue(META.KEY, KEY);
metaResult.get(0).setValue(META.OPTION, keyId);
mock[0] = new MockResult(1, metaResult);

} else if (sql.startsWith(SELECT_KEY)) {

Result<KeyRecord> keyResult = create.newResult(KEY);
if (counter == FIRST_ITERARION_COUNTER_VALUE) {
// first SELECT returns monkey, rest will return no results
keyResult.add(create.newRecord(KEY));
keyResult.get(0).setValue(KEY.ID, 1L);
keyResult.get(0).setValue(KEY.VALUE, MONKEY);
mock[0] = new MockResult(1, keyResult);
} else {
mock[0] = new MockResult(0, keyResult);
}
counter++;
}

return mock;
}
}

它有效但看起来很糟糕。总结一下我的问题是:如何根据查询和查询执行次数返回(使用一个提供程序)不同的结果。也许此类仅用于简单的 DSLContext 模拟,而不是模拟整个 DAO,它使用一个 DSLContext 多次使用许多查询。

最佳答案

我已经这样做了,但这并不好玩——最后的模拟需要自己的测试……另一种方法是使模拟提供者能够配置预期的内容和返回的内容。

provider.when(..).times(5).return(...)

等等……返回值可以带一个生成器和文字值。什么时候可以使用正则表达式以及字符串

关于java - JOOQ MockDataProvider - 如何根据某些条件返回不同的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com