PowerMockito издевается над статическим классом INSIDE enum?

У меня есть перечисление, которое должно иметь внутренний статический класс для инъекции bean-компонентов.

Я чувствую, что столкнулся с самой сложной ситуацией для макета: перечисление, статический класс, статическое поле, статический метод ...

public enum Category{

    C1(Something(Constants.getFactory().createSomething(""))),
    C2(...);

    public static Constants {
        @Autowired
        private static Factory factory;

        public static Factory getFactory(){
            return factory;
        }
    }
}

И мой класс тестирования с использованием PowerMockito:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Category.class,Category.Constants.class})
public class CategoryTests {

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(Category.class);
        PowerMockito.mockStatic(Category.Constants.class);  

        //This simply testing mock didn't work             
        //PowerMockito.when(Category.Constants
        //                .getFactory()).thenReturn("123");


        //I tried to mock the inner field 'factory' and use it directly without a getter 
        //(with small changes in the original class)
        //But it didn't work either
        Factory factory = PowerMockito.mock(Factory.class);
        NewClass newClass = PowerMockito.mock(NewClass.class);
        PowerMockito.when(Factory.createSomething(anySring()))
                                         .thenReturn(newClass);

        Whitebox.setInternalState(
                 Category.Constants.class,"factory",Factory);


        //This is like the most common way to stub
        //It didn't work, so I believe the inner static class were never mocked
        PowerMockito.doReturn(factory).when(Category.Constants.class,
                                       "getFactory", anyString());
    }


    //I don't know if real test cases matter that much but I update to add it for reference.
    @Test(dataProvider = "Case1")
    public void testFromFilterType(final String testName, String input, final Category expected) {
        assertEquals(Category.doSomething(input), expected);
    }

    @DataProvider(name = "Case1")
    Object[][] fromFilterTypeCases() {
        return new Object[][] {
            { "C1", "input1", Category.C1 },
            { "C2", "input2", Category.C2 },
        };
    }
}
//Currently the tests got skipped because in class Category Constants.getFactory().createSomething(""), 
//where Constants.getFactory() returns null and mocking doesn't work.

Сначала я издевался не над Enum, а только над статическим внутренним классом. После долгих поисков я пробовал всеми способами. Настройка кажется правильной, но некоторые уловки могут быть упущены. Любая помощь?

Я полагал, что эти издевательства выполняются ПОСЛЕ инициализации перечисления. Как издеваться над методом до инициализации перечисления?

user6219476 13.09.2018 23:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
326
1

Ответы 1

Немного догадываюсь: Category.class - это класс, который вы собираетесь тестировать. Сам этот класс содержит ничего такого, который требует фиксации / подготовки. Итак: отбросьте эти части в свой код. Даже если это не вызывает вашей текущей проблемы, я почти уверен, что это может иметь всевозможные нежелательные последствия, когда вы начнете тестирование позже.

Кроме того, реальным ответом было бы вообще избежать необходимости в PowerMock (ito). Вы уже используете @Autowired, что означает, что вы используете структуру DI. Большинство фреймворков DI также имеют перехватчики для модульного тестирования. Поэтому вам лучше попытаться заставить @Autowired работать в вашей тестовой настройке.

Спасибо, мне нужно издеваться над 'Constants.getFactory (). CreateSomething ("")', используемым внутри перечисления. Как мне избавиться от насмешек, не возвращая нулевое значение?

user6219476 13.09.2018 22:08

Другие вопросы по теме