Why do you need to wait for some time before getting a response?
Mocks are certainly not what you should look at if you want to simulate complex behavior such as something that changes state over time. Technically, it might be possible using an Answer, but I don't see how it is easier than alternatives. Here are some ideas.
Option 1:
In your test, I see
when(executorServiceMock.submit(new StateTask(10000))).thenReturn(futureMock)
This might work provided your executorService is mockable, that is it can be passed by the test to the code under test (to the constructor, for example).
Then, you might configure your futureMock as follows:
when(futureMock.get(10000,TimeUnit.MILLISECONDS)).thenReturn(true);
This will simulate a behavior where the future immediately returns true. This still makes sense, because the actual behavior of your Callable does not need to be verified (you can do that in a separate StateTaskTest).
You might also add a test that checks what happens then futureMock.get() returns false.
Option 2:
Do not use mock. Just run your code pretty much as is (maybe mock just the checkState() part). Yes, it will take longer to run (you might want to configure the period from the test), but that seems to be exactly what you are trying to do.
Option 3:
Use an answer.
when(futureMock.get(10000,TimeUnit.MILLISECONDS)).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
Thread.sleep(10000);
return true;
}
})
To be honest, I don't see how that solution helps more than the others.