Почему статический блок выполняется только один раз?
Потому что в этом весь смысл статических блоков инициализатора!
Или, другими словами, если вы хотите, чтобы какой-то код инициализации выполнялся несколько раз, поместите его в обычный конструктор или метод или (в крошечном числе случаев) в нестатический блок инициализатора.
В контексте JUnit - обычный способ реализации кода запуска и завершения теста с использованием методов setUp()
и tearDown()
.
Если вы пытаетесь выполнить модульное тестирование выполнения статической инициализации в своем собственном коде, я думаю, вас ждет трудный путь. Но потом, модульное тестирование кода со статическим состоянием (например, синглтонами) всегда сложно ... и это одна из причин, по которой люди думают, что статическое состояние - плохая идея.
Подумайте об использовании структуры внедрения зависимостей (или Inversion of Control) вместо синглетонов.
В качестве альтернативы рассмотрите возможность изменения кода синглтонов / статической инициализации для упрощения тестирования. Например, добавьте статический метод, который позволяет тесту повторно выполнить инициализацию. (И прежде чем вы скажете, что это нарушает шаблон синглтона: да, я знаю. Вам нужно выбрать между «чистотой» проектирования / реализации и простотой тестирования.)