它只回答适配器实际使用的查询形态,因此测试断言的是外部行为(发现清单、最新测试、分表定位、
* 单位换算、水位过滤),不是 SQL 文本本身;记录下来的语句用于断言只读防线没有漏过非查询语句。
*/
final class FakeVendorDatabase
{
record ChannelRow(long devUid, int unitId, int chlId) { }
record TestRow(long devUid, int unitId, int chlId, long testId, String startTime,
String firstTable, String secondTable) { }
record SampleRow(String table, long testId, int unitId, int chlId, long seqId, int cycle, int stepId,
String stepType, long testTimeMillis, int voltage, int current, int capacityCharge, int energyCharge,
int capacityDischarge, int energyDischarge, String testAtime) { }
/** 工步层一行:工步层不随采样分表滚动,所以没有表名。 */
record CapStepRow(long testId, long devUid, int unitId, int chlId, long seqId, int cycle, int stepId,
String stepType, long testTimeMillis, int voltage, int current, int capacityCharge, int energyCharge,
int capacityDischarge, int energyDischarge, int middleVoltage, String testAtime) { }
private final List statements = new java.util.concurrent.CopyOnWriteArrayList<>();
private final List channels = new ArrayList<>();
private final List tests = new ArrayList<>();
private final List samples = new ArrayList<>();
private final List capSteps = new ArrayList<>();
FakeVendorDatabase registeredChannel(long devUid, int unitId, int chlId)
{
channels.add(new ChannelRow(devUid, unitId, chlId));
return this;
}
FakeVendorDatabase test(TestRow row)
{
tests.add(row);
return this;
}
FakeVendorDatabase sample(SampleRow row)
{
samples.add(row);
return this;
}
FakeVendorDatabase capStep(CapStepRow row)
{
capSteps.add(row);
return this;
}
/** 到达"驱动"的语句原文,按调用顺序。 */
List statements()
{
return List.copyOf(statements);
}
DataSource dataSource()
{
return new DataSource()
{
@Override
public Connection getConnection()
{
return connection();
}
@Override
public Connection getConnection(String username, String password)
{
return connection();
}
@Override
public java.io.PrintWriter getLogWriter()
{
return null;
}
@Override
public void setLogWriter(java.io.PrintWriter out)
{
}
@Override
public void setLoginTimeout(int seconds)
{
}
@Override
public int getLoginTimeout()
{
return 0;
}
@Override
public java.util.logging.Logger getParentLogger()
{
return java.util.logging.Logger.getLogger("fake-vendor");
}
@Override
public T unwrap(Class iface) throws SQLException
{
throw new SQLException("不支持解包");
}
@Override
public boolean isWrapperFor(Class> iface)
{
return false;
}
};
}
private Connection connection()
{
return (Connection) Proxy.newProxyInstance(getClass().getClassLoader(), new Class>[] { Connection.class },
(proxy, method, args) -> {
if ("prepareStatement".equals(method.getName())) return statement((String) args[0]);
if ("createStatement".equals(method.getName())) return plainStatement();
return defaultValue(method);
});
}
/** 语句级执行:SQL 在执行时才出现,因此在这里才记录;探测类语句不回数据。 */
private java.sql.Statement plainStatement()
{
return (java.sql.Statement) Proxy.newProxyInstance(getClass().getClassLoader(),
new Class>[] { java.sql.Statement.class }, (proxy, method, args) -> {
if ("executeQuery".equals(method.getName()) || "execute".equals(method.getName())
|| "executeUpdate".equals(method.getName()))
{
statements.add((String) args[0]);
return resultSet(List.of());
}
return defaultValue(method);
});
}
private PreparedStatement statement(String sql)
{
statements.add(sql);
List