Не удается создать шаблон RestTemplate с помощью @PowerMockIgnore в powermock

java #junit4 #powermock #powermockito

#java #junit4 #powermock #powermockito

Вопрос:

Мне нужен powermock для тестирования частного метода.
Он работает хорошо, если я использую только @RunWith (PowerMockRunner.class ) без @PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class ).

Мне нужно использовать @PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class ) для @autowired. Но он не запускается.

 @RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyConfig.class}) 
@SpringBootTest
public class SpringPowerMockTest {

}
 

Подробная информация об ошибке

java.lang.Ошибка IllegalAccessError: класс javax.xml.parsers.FactoryFinder (в неназванном модуле @0x45d84a20) не может получить доступ к классу jdk.xml.internal.Поддержка безопасности (в модуле java.xml ) потому что модуль java.xml не экспортирует jdk.xml.internal в неназванный модуль @0x45d84a20
 в javax.xml.parsers.FactoryFinder.(FactoryFinder.java:69)
в javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:147)
 в ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:79)
в ch.qos.logback.core.joran.event.SaxEventRecorder.recordEvents(SaxEventRecorder.java:57)
в ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:151)
 в ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
 в ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
в ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
в разделе.qos.logback.classic.util.ContextInitializer.AutoConfig(ContextInitializer.java:150)
 в org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
 в org.slf4j.impl.StaticLoggerBinder.(StaticLoggerBinder.java:55)
в org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
 в org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
 в org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417)
в org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
 в org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
 в org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
 в org.apache.commons.ведение журнала.LogFactory.getLog(LogFactory.java:655)
 в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.(SpringJUnit4ClassRunner.java:99)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62 )
в java.base/jdk.internal.reflect.Делегирование constructoraccessorimpl.newInstance(делегирование constructoraccessorimpl.java:45)
в java.base/java.lang.reflect.Конструктор.newInstance(Constructor.java:490)
 в org.powermock.reflect.internal.WhiteboxImpl.CreateInstance(WhiteboxImpl.java:1414)
в org.powermock.reflect.internal.WhiteboxImpl.invokeConstructor(WhiteboxImpl.java:1262)
 в org.powermock.reflect.Whitebox.invokeConstructor(Whitebox.java:497)
 в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner $1.вызов (делегирование PowerMockRunner.java:101)
в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner $1.вызов (делегирование PowerMockRunner.java:97)
в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner.withContextClassLoader(делегирование PowerMockRunner.java:132)
 в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner.CreateDelegate(делегирование PowerMockRunner.java:96)
в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner.(Делегирование PowerMockRunner.java:64)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 в java.base/jdk.internal.reflect.Делегирование constructoraccessorimpl.newInstance(делегирование constructoraccessorimpl.java:45)
в java.base/java.lang.reflect.Конструктор.newInstance(Constructor.java:490)
 в org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:165)
 в org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:47)
в org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:107)
 в org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.(JUnit4TestSuiteChunkerImpl.java:69)
в org.powermock.modules.junit4.common.internal.impl.abstractcommon PowerMockRunner.(abstractcommon PowerMockRunner.java:36)
в org.powermock.modules.junit4.PowerMockRunner.(PowerMockRunner.java:34)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 в java.base/jdk.internal.reflect.Делегирование constructoraccessorimpl.newInstance(делегирование constructoraccessorimpl.java:45)
в java.base/java.lang.reflect.Конструктор.newInstance(Constructor.java:490)
 в org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
в org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
в org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
в org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37)
в org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
в org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28)
в org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19)
в org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
в org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
в org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
 в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
 в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:768)
в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)


Поэтому я добавляю это через https://github.com/powermock/powermock/issues/864

 @RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyConfig.class}) 
// I added this
@PowerMockIgnore({"javax.net.ssl.*", "org.slf4j.*", "javax.parsers.*", "ch.qos.logback.*", 
"jdk.xml.internal.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", 
"javax.management.*"})
@SpringBootTest
public class SpringPowerMockTest {

    @Test
    public void test() {
      //success
    }

}
 

Он работал хорошо.

Поэтому я начал писать код для тестирования

 @RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyConfig.class}) 
@PowerMockIgnore({"javax.net.ssl.*", "org.slf4j.*", "javax.parsers.*", "ch.qos.logback.*", 
"jdk.xml.internal.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", 
"javax.management.*"})
@SpringBootTest
public class SpringPowerMockTest {

    @Test
    public void initalize() throws IOException {
        RestTemplate restTemplate = new RestTemplate();
        .....
    }


}
 

Но я не мог начать с этого сообщения об ошибке

javax.xml.transform.Ошибка преобразования factoryconfiguration: Provider com.sun.org.apache.xalan.internal.xsltc.trax.Не удалось создать экземпляр TransformerFactoryImpl: java.lang.reflect.Исключение InvocationTargetException
в java.xml/javax.xml.transform.FactoryFinder.newInstance(FactoryFinder.java:181)
 в java.xml/ javax.xml.transform.FactoryFinder.find(FactoryFinder.java: 257)
 в java.xml/ javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:126)
 в org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.(AbstractXmlHttpMessageConverter.java:52)
в org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter.(AbstractJaxb2HttpMessageConverter.java:38)
в org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.(Jaxb2RootElementHttpMessageConverter.java:64)
в org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter .(AllEncompassingFormHttpMessageConverter.java:86)
в org.springframework.web.client.RestTemplate.(RestTemplate.java:161)
 в com.nesic.mroc.elevator.SpringPowerMockTest.initalize(SpringPowerMockTest.java:26)
 в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(собственный метод)
в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.reflect .Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43)
в java.base/java.lang.reflect.Метод.invoke(Метод.java: 566)
 в org.junit.runners.model.FrameworkMethod$1.Запустите reflectivecall(FrameworkMethod.java:59)
в org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
в org.junit.runners.model.FrameworkMethod.invoke взрывоопасно (FrameworkMethod.java:56)
в org.junit.internal.runners.statements.invokeMethod.evaluate(invokeMethod.java:17)
в org.springframework.test.context.junit4.statements .RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
в org.springframework.test.context.junit4.statements .Запустите aftertestexecutioncallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
в org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
 в org.springframework.test.context.junit4.statements.Запустите aftertestmethodcallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
в org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
в org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
 в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
 в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
в org.junit.runners.ParentRunner$4.выполнить(ParentRunner.java:331)
 в org.junit.runners.ParentRunner$1.расписание (ParentRunner.java:79)
в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
 в org.junit.runners.ParentRunner.access$ 100(ParentRunner.java:66)
в org.junit.runners.ParentRunner $ 2.оценка (ParentRunner.java:293)
 в org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
в org.springframework.test.context.junit4.statements .Запустите после завершения тестирования classcallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
 в org.junit.runners.ParentRunner$3.оценка (ParentRunner.java:306)
 в org.junit.runners.ParentRunner.run(ParentRunner.java:413)
в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
 в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner $2.вызов(делегирование PowerMockRunner.java:149)
 в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner $2.вызов(делегирование PowerMockRunner.java:141)
 в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner.withContextClassLoader(делегирование PowerMockRunner.java:132)
 в org.powermock.modules.junit4.internal.impl.Делегирование PowerMockRunner.run(Делегирование PowerMockRunner.java:141)
 в org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
 в org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57 )
в org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
 в org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
 в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:768)
в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Вызвано: java.lang.reflect.Исключение InvocationTargetException
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод)
в java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62 )
в java.base/jdk.internal.reflect.Делегирование constructoraccessorimpl.newInstance(делегирование constructoraccessorimpl.java:45)
в java.base/java.lang.reflect.Конструктор.newInstance(Constructor.java:490)
 в java.xml/ javax.xml.transform.FactoryFinder.newInstance(FactoryFinder.java:169)
... еще 47
Вызвано: java.lang.Ошибка незаконного доступа: класс com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl (в неназванном модуле @0x10d5ba8d) не удается получить доступ к классу jdk.xml.internal.JdkXmlUtils (в модуле java.xml ) потому что модуль java.xml не экспортирует jdk.xml.internal в неназванный модуль @0x10d5ba8d по
адресу com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.(TransformerFactoryImpl.java:251)
 ... 52 больше


мой pom.xml

     <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>2.0.0-beta.5</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>2.0.0-beta.5</version>
    </dependency>
    <dependency>
        <groupId>pl.pragmatists</groupId>
        <artifactId>JUnitParams</artifactId>
        <version>1.0.5</version>
        <scope>test</scope>
    </dependency>
 

Я не знаю, почему я не могу создать RestTempleate. и я не знаю @PowerMockIgnore

Ответ №1:

Я решил это, добавив код в строку. Но я не могу понять, в чем причина.

 com.sun.org.apache.xalan.internal.xsltc.trax.*
 

Это код, который блокирует метод

 import static org.junit.Assert.*;
import static org.mockito.ArgumentMatchers.*;
import static org.powermock.api.mockito.PowerMockito.*;

import java.io.File;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;

import lombok.AllArgsConstructor;
import lombok.Data;


@SpringBootTest
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PrepareForTest(PowerMockTarget.class)
@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "javax.xml.transform.*", "org.xml.*", "javax.management.*", "javax.net.ssl.*", "com.sun.org.apache.xalan.internal.xsltc.trax.*"})
public class PowerMockTest {

    @Test
    public void mockStaticMethod() throws Exception {
        File fileMock = mock(File.class);
        when(fileMock.exists()).thenReturn(true);

        whenNew(File.class.getConstructor(String.class)).withArguments(anyString()).thenReturn(fileMock);
        
        PowerMockTarget target = new PowerMockTarget();
        assertEquals(target.isFileExist(), true);

        assertEquals("My bean message", message.getContent());
    }
}

@Data
@AllArgsConstructor
class MessageForTest{
    private long id;
    private String content;
    
}


@Data
@AllArgsConstructor
class MessageForTest{
    private long id;
    private String content;
    
}
 

Целевой код с блокировкой питания.

 import java.io.File;

public class PowerMockTarget {

    public boolean isFileExist() {
    
        if(!new File("filename").exists()) {
          throw new RuntimeException();
        }
        return true;
    }
}