Объекты ведут себя странно при имитации частного метода тестируемого класса с помощью jmockit

Экземпляр объекта моего тестируемого класса меняется, когда я пытаюсь смоделировать частный метод моего класса. У меня есть объект CUT, который я инициализирую в методе настройки @Before.

@Before
public void setUp() {
    cutInstance = new CUT();

и в моем тестовом методе я издевался над CUT, создавая локальный объект CUT

@Test
public void test_someMethod(@Mocked CUT cutInstanceLocal)

затем издевается над частным методом CUT с использованием Expectations API

new Expectations(cutInstanceLocal) {{
    Deencapsulation.invoke(cutInstanceLocal, "cutPrivateMethod", value);
    result = fakeValue;
}};

теперь тестируем cutMethod(param), который будет внутренне вызывать издевательский метод.

теперь при тестировании иногда я получаю значение параметра как нулевое, что странно.

Почему так происходит?


person User12001    schedule 17.06.2015    source источник
comment
Имитация частного метода, скорее всего, сделает ваши тесты хрупкими. Я предлагаю извлечь класс с поведением, которое вы хотите заглушить.   -  person NamshubWriter    schedule 18.06.2015


Ответы (1)


Вы неправильно используете JMockit. Во-первых, вам не нужно использовать деинкапсуляцию. JMockit может имитировать частные методы. Во-вторых, в Ожиданиях вы должны указать ожидания от зависимых классов, а не от тестируемого класса (CUT).

Если все, что вы хотите сделать, это издеваться над методом CUT, просто издевайтесь над ним:

new MockUp<CUT>(){
      public Object cutPrivateMethod(Object value){
         return fakeValue;
      }
};

Даже если бы cutPrivateMethod был приватным в классе CUT, над ним бы издевались.

person Josef.B    schedule 09.07.2015