Как насмехаться с classом одиночного Single Enum с использованием Mockito / Powermock?

Я не уверен, как издеваться над enum singleton class.

public enum SingletonObject{ INSTANCE; private int num; protected setNum(int num) { this.num = num; } public int getNum() { return num; } 

Я хотел бы заглушить getNum () в приведенном выше примере, но я не могу понять, как издеваться над фактическим classом SingletonObject. Я думал, что использование Powermock для подготовки теста поможет, поскольку enums по сути являются окончательными.

 //... rest of test code @Test public void test() { PowerMockito.mock(SingletonObject.class); when(SingletonObject.INSTANCE.getNum()).thenReturn(1); //does not work } 

Это использует PowerMockMockito 1.4.10 и Mockito 1.8.5.

Если вы хотите заглушить то, что возвращает INSTANCE, вы можете это сделать, но это отвратительно (с использованием манипуляции reflectionм и байт-кодом). Я создал и протестировал простой проект с тремя classами, используя PowerMock 1.4.12 / Mockito 1.9.0. Все classы были в одном пакете.

SingletonObject.java

 public enum SingletonObject { INSTANCE; private int num; protected void setNum(int num) { this.num = num; } public int getNum() { return num; } } 

SingletonConsumer.java

 public class SingletonConsumer { public String consumeSingletonObject() { return String.valueOf(SingletonObject.INSTANCE.getNum()); } } 

SingletonConsumerTest.java

 import static org.junit.Assert.*; import static org.powermock.api.mockito.PowerMockito.*; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; @RunWith(PowerMockRunner.class) @PrepareForTest({SingletonObject.class}) public class SingletonConsumerTest { @Test public void testConsumeSingletonObject() throws Exception { SingletonObject mockInstance = mock(SingletonObject.class); Whitebox.setInternalState(SingletonObject.class, "INSTANCE", mockInstance); when(mockInstance.getNum()).thenReturn(42); assertEquals("42", new SingletonConsumer().consumeSingletonObject()); } } 

Вызов Whitebox.setInternalState заменяет INSTANCE объектом, с которым вы можете манипулировать в своем тесте.

  • Использование шаблона проектирования Singleton для SQLiteDatabase
  • Зачем использовать синглтон вместо статических методов?
  • Что такое синглтон в C #?
  • Единичное тестирование с одноточечными
  • Одиночный class с несколькими различными загрузчиками classов
  • Классы менеджеров Unity singleton
  • Когда должен быть создан / открыт экземпляр EntityManagerFactory?
  • Шаблон для ленивого streamобезопасного создания одноэлементов в java
  • Шаблон Singleton
  • Каков эффективный способ реализации одноэлементного шаблона в Java?
  • должно ли соединение db быть одиночным?
  • Давайте будем гением компьютера.