- 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
ConstructorDescriptionMockFileDatabase
(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 TypeMethodDescriptionExecution callback for a JDBC query execution.nullLiteral
(String literal) Deprecated.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 thenull
literal, i.e. the string that should be parsed as anull
reference, rather than as the string itself.- See Also:
-
queries
Deprecated.- Experimental: Do not use. Subject to change. -
execute
Description copied from interface:MockDataProvider
Execution callback for a JDBC query execution.This callback will be called by
MockStatement
upon 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:
MockStatement
does not distinguish between "static" and "prepared" statements. However, a non-emptyMockExecuteContext.bindings()
is a strong indicator for aPreparedStatement
.MockStatement
does 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
MockResult
objects 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.data
to your first result, in addition to the affectedMockResult.rows
. The relevant flag is passed fromMockStatement
to 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:
execute
in interfaceMockDataProvider
- Parameters:
ctx
- The execution context.- Returns:
- The execution results. If a
null
or an emptyMockResult[]
is returned, this has the same effect as returningnew MockResult[] { new MockResult(-1, null) }
- Throws:
SQLException
- ASQLException
that is passed through to jOOQ.
-
MockFileDatabaseConfiguration.nullLiteral(String)
instead.