- All Implemented Interfaces:
MockDataProvider
MockDataProvider.
This data provider reads a database model from a text file, as documented in
the below sample file:
# Comments start off with a hash
# Statement strings have no prefix and should be ended with a semi-colon
select 'A' from dual;
# Statements may be followed by results, using >
> A
> -
> A
# Statements should be followed by "@ rows: [N]" indicating the update count
@ rows: 1
# New statements can be listed int his file
select 'A', 'B' from dual;
> A B
> - -
> A B
@ rows: 1
# Beware of the exact syntax (e.g. using quotes)
select "TABLE1"."ID1", "TABLE1"."NAME1" from "TABLE1";
> ID1 NAME1
> --- -----
> 1 X
> 2 Y
@ rows: 2
# Statements can return several results
> F1 F2 F3 is a bit more complex
> --- -- ----------------------------
> 1 2 and a string containing data
> 1.1 x another string
@ rows: 2
> A B "C D"
> - - -----
> x y z
@ rows: 1
Results can be loaded using several techniques:
- When results are prefixed with
>, thenDSLContext.fetchFromTXT(String)is used - In the future, other types of result sources will be supported, such as CSV, XML, JSON
Disclaimer: The general idea of mocking a JDBC connection with this jOOQ API is to provide quick workarounds, injection points, etc. using a very simple JDBC abstraction. It is NOT RECOMMENDED to emulate an entire database (including complex state transitions, transactions, locking, etc.) using this mock API. Once you have this requirement, please consider using an actual database instead for integration testing (e.g. using https://www.testcontainers.org), rather than implementing your test database inside of a MockDataProvider.
- Author:
- Lukas Eder, Samy Deghou
-
Constructor Summary
ConstructorsConstructorDescriptionMockFileDatabase(File file)MockFileDatabase(File file, String encoding)MockFileDatabase(InputStream stream)MockFileDatabase(InputStream stream, String encoding)MockFileDatabase(Reader reader)MockFileDatabase(String string)MockFileDatabase(Source source)MockFileDatabase(MockFileDatabaseConfiguration configuration) -
Method Summary
Modifier and TypeMethodDescriptionexecute(MockExecuteContext ctx)Execution callback for a JDBC query execution.nullLiteral(String literal)Deprecated.Map<String,List<MockResult>>queries()Deprecated.- Experimental: Do not use.
-
Constructor Details
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
MockFileDatabase
- Throws:
IOException
-
-
Method Details
-
nullLiteral
Deprecated.- UseMockFileDatabaseConfiguration.nullLiteral(String)instead.Specify thenullliteral, i.e. the string that should be parsed as anullreference, rather than as the string itself.- See Also:
DSLContext.fetchFromTXT(String, String)
-
queries
Deprecated.- Experimental: Do not use. Subject to change. -
execute
Description copied from interface:MockDataProviderExecution callback for a JDBC query execution.This callback will be called by
MockStatementupon the various statement execution methods. These include:Statement.execute(String)Statement.execute(String, int)Statement.execute(String, int[])Statement.execute(String, String[])Statement.executeBatch()Statement.executeQuery(String)Statement.executeUpdate(String)Statement.executeUpdate(String, int)Statement.executeUpdate(String, int[])Statement.executeUpdate(String, String[])PreparedStatement.execute()PreparedStatement.executeQuery()PreparedStatement.executeUpdate()
The various execution modes are unified into this simple method. Implementations should adhere to this contract:
MockStatementdoes not distinguish between "static" and "prepared" statements. However, a non-emptyMockExecuteContext.bindings()is a strong indicator for aPreparedStatement.MockStatementdoes not distinguish between "batch" and "single" statements. However...- A
MockExecuteContext.batchSQL()with more than one SQL string is a strong indicator for a "multi-batch statement", as understood by jOOQ'sDSLContext.batch(Query...). - A
MockExecuteContext.batchBindings()with more than one bind variable array is a strong indicator for a "single-batch statement", as understood by jOOQ'sDSLContext.batch(Query).
- A
- It is recommended to return as many
MockResultobjects as batch executions. In other words, you should guarantee that:int multiSize = context.getBatchSQL().length; int singleSize = context.getBatchBindings().length; assertEquals(result.length, Math.max(multiSize, singleSize))
This holds true also for non-batch executions (where both sizes are equal to
1) - You may also return more than one result for non-batch executions.
This is useful for procedure calls with several result sets.
- In JDBC, such additional result sets can be obtained with
Statement.getMoreResults(). - In jOOQ, such additional result sets can be obtained with
ResultQuery.fetchMany()
- In JDBC, such additional result sets can be obtained with
- If generated keys (
Statement.RETURN_GENERATED_KEYS) are requested from this execution, you can also addMockResult.datato your first result, in addition to the affectedMockResult.rows. The relevant flag is passed fromMockStatementto any of these properties: - OUT parameters from stored procedures are generated from the first
MockResult's firstRecord. If OUT parameters are requested, implementors must ensure the presence of such aRecord.
- Specified by:
executein interfaceMockDataProvider- Parameters:
ctx- The execution context.- Returns:
- The execution results. If a
nullor an emptyMockResult[]is returned, this has the same effect as returningnew MockResult[] { new MockResult(-1, null) } - Throws:
SQLException- ASQLExceptionthat is passed through to jOOQ.
-
MockFileDatabaseConfiguration.nullLiteral(String)instead.