Таким образом, вы запускаете метод SampleCaching # start самостоятельно, это, в свою очередь, говорит ScheduledExecutorService, чтобы вызвать метод вычисления с начальной задержкой 0 секунд. Это будет происходить в отдельном потоке. Тем временем ваш тестовый код продолжает выполняться, и в следующий раз он проверяет, что метод populateMultimedia не был вызван в вашем multimediaCache. и то же самое для populateOne и populateTwo. Успех этого будет зависеть от прогресса, достигнутого методом вычисления в другом потоке, который был запущен. Если он уже вызвал метод populateMultimedia, то ваша первая проверка не удастся, как и остальные. Если, с другой стороны, он не продвинулся так далеко, тест будет успешным, но, возможно, он не будет выполнен в populateOne или populateTwo.
Вам либо нужно встроить механизм синхронизации (например, java .util. concurrent.CountDownLatch) этот ваш метод вычисления выполняет countDown в конце, а ваш тестовый код ожидает перед проверкой или вы установили разумную задержку между вызовом метода start и вызовами проверки. Первый является навязчивым, поскольку он изменяет компонент, который вы тестируете. Вы можете подумать о создании подкласса SimpleCaching, который переопределяет метод вычисления, но, опять же, это навязчиво, если ваш метод вычисления является закрытым.