Я пытаюсь проверить класс, который использует класс калькулятора с рядом статических методов. Я успешно издевался над другим классом аналогичным образом, но этот оказался более упрямым.Мощный статический метод PowerMockito не работает при вызове метода по параметру
Похоже, что если метод издевательства содержит вызов метода на одном из переданных аргументов, статический метод не издевается (и тестовые разрывы). Удаление внутреннего вызова явно не является вариантом. Есть ли что-то очевидное, что я здесь отсутствует?
Вот сокращенный вариант, который ведет себя так же, как ...
public class SmallCalculator {
public static int getLength(String string){
int length = 0;
//length = string.length(); // Uncomment this line and the mocking no longer works...
return length;
}
}
А вот тест ...
import static org.junit.Assert.assertEquals;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.solveit.aps.transport.model.impl.SmallCalculator;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ SmallCalculator.class})
public class SmallTester {
@Test
public void smallTest(){
PowerMockito.spy(SmallCalculator.class);
given(SmallCalculator.getLength(any(String.class))).willReturn(5);
assertEquals(5, SmallCalculator.getLength(""));
}
}
Кажется, есть некоторая путаница в вопросе, так что я имею придумал более «реалистичный» пример. Это добавляет уровень косвенности, так что не кажется, что я тестирую метод издевательства напрямую. Класс SmallCalculator неизменна:
public class BigCalculator {
public int getLength(){
int length = SmallCalculator.getLength("random string");
// ... other logic
return length;
}
public static void main(String... args){
new BigCalculator();
}
}
И вот новый класс тест ...
import static org.junit.Assert.assertEquals;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.solveit.aps.transport.model.impl.BigCalculator;
import com.solveit.aps.transport.model.impl.SmallCalculator;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ SmallCalculator.class})
public class BigTester {
@Test
public void bigTest(){
PowerMockito.spy(SmallCalculator.class);
given(SmallCalculator.getLength(any(String.class))).willReturn(5);
BigCalculator bigCalculator = new BigCalculator();
assertEquals(5, bigCalculator.getLength());
}
}
И что происходит? –
, если только этот фрагмент кода/теста не является доказательством того, что издевательская структура не позволяет макетировать то, что, как предполагается, издевается над этим, здесь возникает большая путаница. Нужно ** НЕ ** макетировать класс, который проходит под тестом, а скорее она издевается над своими зависимостями, чтобы она могла протестировать поведение класса. – Alp
В этом примере я получаю NPE, когда вызывается string.length(). Это странно, потому что кажется, что аргумент заменяется, но фактический метод не издевается. – maccaroo