Не удается создать подкласс финального класса с PowerMockRule
Я использую JUNIT с Powermockito и EclEmma для тестирования моего кода. Теперь есть проблема. Я должен проверить этот класс:
public class Main
{
private static final Logger slf4jLogger = LoggerFactory.getLogger(Main.class);
private static final Marker marker = MarkerFactory.getMarker("Test");
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(slf4jLogger);
slf4jLogger.debug(marker, "Hallo");
slf4jLogger.trace(marker, "Hallo");
slf4jLogger.info(marker, "Hallo");
slf4jLogger.warn(marker, "Hallo");
slf4jLogger.error(marker, "Hallo");
}
}
Вот мой тест:
@PrepareForTest({ LoggerFactory.class, Main.class })
public class MainTest
{
@Rule
public PowerMockRule rule = new PowerMockRule();
@Rule
public ExpectedException thrown = ExpectedException.none();
/**
* Test static Fields
*
* @throws Exception
*/
@Test
public void testMain() throws Exception
{
Logger logger = PowerMockito.mock(Logger.class);
PowerMockito.mockStatic(LoggerFactory.class);
PowerMockito.when(LoggerFactory.getLogger(Mockito.any(Class.class))).thenReturn(logger);
Main.main(null);
Mockito.verify(logger).debug(Mockito.any(Marker.class), Mockito.eq("Hallo"));
Mockito.verify(logger).trace(Mockito.any(Marker.class), Mockito.eq("Hallo"));
Mockito.verify(logger).info(Mockito.any(Marker.class), Mockito.eq("Hallo"));
Mockito.verify(logger).warn(Mockito.any(Marker.class), Mockito.eq("Hallo"));
Mockito.verify(logger).error(Mockito.any(Marker.class), Mockito.eq("Hallo"));
}
}
Но есть следующая ошибка:
java.lang.IllegalArgumentException: Невозможно создать подкласс конечного класса класса org.slf4j.LoggerFactory в org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447) в org.mockito.cglib.core.DefGateGrateStrate. Java:25) в org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) в org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378) в org.mockitoproxyg.Enhancer.createClass(Enhancer.java:318) в org.powermock.api.mockito.repackaged.ClassImposterizer.createProxyClass(ClassImposterizer.java:123) в org.powermock.api.mockito.repackaged.Classizer_mposteragedimpimp.:57) в org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111) в org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(mockCreator.mock) org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) ...
Я не хочу к powermock-module-javaagent. Есть ли способ сделать это?
1 ответ
Одним из вариантов будет создание статического метода получения для slf4jLogger
затем рефакторинг main
метод для вызова этого нового метода. Затем вы можете заглушить этот метод в своих тестах:
PowerMockito.spy(Main.class);
PowerMockito.when(Main.getSlf4jlogger()).thenReturn(logger);
(вместо
PowerMockito.mockStatic(LoggerFactory.class);
PowerMockito.when(LoggerFactory.getLogger(Mockito.any(Class.class))).thenReturn(logger);
)