Мой девиз для Java "просто потому, что Java имеет статические блоки, это не значит, что вы должны их использовать". Шутки в сторону, на Java есть много трюков, которые делают тестирование кошмаром. Два из самых я ненавижу Анонимные классы и Статические блоки. У нас есть много устаревшего кода, в котором используются статические блоки, и это один из раздражающих моментов в наших тестах ввода текста. Наша цель - написать модульные тесты для классов, которые зависят от этой статической инициализации с минимальными изменениями кода.
До сих пор моим предложением моим коллегам было переместить тело статического блока в частный статический метод и называть его staticInit
. Затем этот метод можно вызвать из статического блока. Для модульного тестирования другой класс, который зависит от этого класса, может легко высмеять staticInit
с JMockit, чтобы ничего не делать. Давайте посмотрим на это в примере.
public class ClassWithStaticInit {
static {
System.out.println("static initializer.");
}
}
Будет изменено на
public class ClassWithStaticInit {
static {
staticInit();
}
private static void staticInit() {
System.out.println("static initialized.");
}
}
Итак, мы можем сделать следующее в JUnit.
public class DependentClassTest {
public static class MockClassWithStaticInit {
public static void staticInit() {
}
}
@BeforeClass
public static void setUpBeforeClass() {
Mockit.redefineMethods(ClassWithStaticInit.class, MockClassWithStaticInit.class);
}
}
Однако это решение также имеет свои проблемы. Вы не можете запускать DependentClassTest
и ClassWithStaticInitTest
на одном JVM, так как вы действительно хотите, чтобы статический блок выполнялся для ClassWithStaticInitTest
.
Каким будет ваш способ решения этой задачи? Или какие-либо лучшие решения, основанные на не-JMockit, которые, по вашему мнению, будут работать более чистыми?