Hi!
I've been trying to write a mocked test that "proves" the correctness of a query.
The query looks like this:
dslContext.select(TBL_TASK.STATE) //
.from(TBL_TASK) //
.where(TBL_TASK.ID.eq(taskId)) //
.fetchOne(TBL_TASK.STATE);
And the test looks like this:
int taskState = 5;
int taskId = 8;
MockDataProvider provider = context -> {
DSLContext create = DSL.using(SQLDialect.MYSQL);
MockResult[] mock = new MockResult[1];
Result<Record1<Integer>> result = create.newResult(TBL_TASK.STATE);
result.add(create.newRecord(TBL_TASK.STATE).values(taskState));
mock[0] = new MockResult(1, result);
return mock;
};
Connection connection = new MockConnection(provider);
DSLContext create = DSL.using(connection, SQLDialect.MYSQL);
Assert.assertEquals(taskState, getTaskState(create, taskId));
This seems to work fine when you try for example try to "fetchOne(
TBL_TASK.ID)" or try to "select(
TBL_TASK.ID)"
But this:
dslContext.select(TBL_TASK.ID) //
.from(TBL_TASK) //
.where(TBL_TASK.ID.eq(taskId)) //
.fetchOne(TBL_TASK.ID);
Also works fine for some reason, even though the mock returns a record containing a state-field? Maybe I'm doing something wrong or have the wrong expectations about how mocking works, but it looks like the fetchOne-function doesn't care about the field name?
Like I said, the test can prove that the query itself is written wrong (selecting state but fetching id), but it can't prove that you aren't trying to correctly access a completely different column (selecting and fetching id-column when mock returns state-column).