Ответ 1
После многого охоты и поиска всех вариантов, которые мог предложить Mockito/Powermock, я нашел решение (которое я поделюсь в случае, если другие столкнутся с этой проблемой).
Если у вас есть частные переменные-члены, которые никогда не инициализируются (и просто предполагается, что они созданы в других местах), вы можете использовать аннотацию @InjectMocks
для "ввода" Mocks, которые вы хотите, в свой класс, который вы тестируете.
- Добавьте переменную в тестовый класс для тестируемого вами класса и дайте ей аннотацию
@InjectMocks
(org.Mockito.InjectMocks). - Используйте
@Mock
аннотации для настройки макетов, которые вы хотите ввести. Используйте свойство name@Mock (name = "privateVariableNameHere")
для сопоставления объекта Mock с частной переменной внутри вашего класса, который вы тестируете. - В функции настройки или перед вызовом вашего класса инициализируйте mocks. Самый простой способ, который я нашел, - использовать метод "setup" с аннотацией
@Before
. Затем внутри там вызовитеMockitoAnnotations.initMocks(this);
, чтобы быстро инициализировать что-либо с помощью аннотации@Mock
. - Определите свою функциональность Mock в методе тестирования (перед вызовом метода, который вы тестируете).
- Используя объект
@InjectMock
, вызовите ваш метод, который вы тестируете... издевательствам ДОЛЖНЫ быть подключены и работать как определено на более ранних этапах.
Итак, для класса класса, который я использовал выше, код для проверки /mock имел бы Connection
, возвращаемый как макет, который вы можете делать с помощью. Основываясь на приведенном выше примере в моем вопросе, это будет выглядеть так:
@RunWith(PowerMockRunner.class)
@PrepareForTest({/* Static Classes I am Mocking */})
public class ExampleTest {
@Mock (name = "queueFactory") //same name as private var.
QueueConnectionFactory queueFactoryMock;
@Mock
Connection connectionMock; //the object we want returned
@InjectMocks
Example exampleTester; //the class to test
@Before
public void setup(){
MockitoAnnotations.initMocks(this); // initialize all the @Mock objects
// Setup other Static Mocks
}
@Test
public void testTestMe(){
//Mock your objects like other "normally" mocked objects
PowerMockito.when(queueFactoryMock.createConnection()).thenReturn(connectionMock);
//...Mock ConnectionMock functionality...
exampleTester.testMe();
}
}