我有以下简单的代码.我有一个类(TestClass),我想测试"someMethod".有一个外部静态方法,由我的"someMethod"调用.我想Powermock那个静态方法给我一些虚拟对象.我在开头有@PrepareForTest(ExternalClass.class),但是当我执行它时会给出错误:
ExternalClass类没有准备好进行测试.要准备此类,请将类添加到'@PrepareForTest'注释中.如果您不使用此批注,请在类或方法级别添加批注.
请帮我指出我使用的方式有什么问题 @PrepareForTest
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExternalClass.class)
public class xyzTest {
@Mock
private RestTemplate restTemplate;
@Mock
private TestClass testClass;
@BeforeClass
private void setUpBeforeClass() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSuccessCase() {
Boolean mockResponse = true;
ResponseEntity<Boolean> response = new ResponseEntity<Boolean>(mockResponse, HttpStatus.OK);
SomeClass someClass = new SomeClass("test", "1.0.0", "someUrl", "someMetaData");
PowerMockito.mockStatic(ExternalClass.class);
Mockito.when(restTemplate.postForEntity(any(String.class), any(String.class), eq(Boolean.class))).thenReturn(response);
Mockito.when(ExternalClass.getSomeClass(any(String.class))).thenReturn(someClass);
Boolean result = testClass.someMethod("test");
Assert.isTrue(result);
Mockito.verify(restTemplate, times(1)).postForObject(any(String.class), any(String.class), any());
}
}
Run Code Online (Sandbox Code Playgroud) 我正在将项目迁移到Java9中,在切换到新的Java版本后,测试开始失败,看来PowerMock正在尝试访问一些它无法访问的类。
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.973 sec <<< FAILURE! - in com.Test
initializationError(com.Test) Time elapsed: 0.007 sec <<< ERROR!
org.objenesis.ObjenesisException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by org/powermock/core/classloader/MockClassLoader cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl
Run Code Online (Sandbox Code Playgroud)
Maven-surefire-插件
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*Test.groovy</include>
<include>**/*Spec.*</include>
</includes>
<forkMode>always</forkMode>
<argLine>--add-modules java.xml.bind</argLine>
<argLine>--add-modules java.activation</argLine>
<argLine>--add-opens=java.base/java.lang=ALL-UNNAMED --illegal-access=warn</argLine>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
powermock依赖
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
</exclusion> …Run Code Online (Sandbox Code Playgroud) 我正在使用 surifire、failsafe、mockito 和 powermock。在我尝试过的地方,我发现 power mock 不支持 Java 11。
我也尝试过最新版本的surefire,但它抛出异常。(如果我跳过测试用例,构建成功)
已用时间:0 秒 <<< 错误!org.objenesis.ObjenesisException: java.lang.reflect.InvocationTargetException
引起:java.lang.reflect.InvocationTargetException 引起:java.lang.IllegalAccessError:org.powermock.core.classloader.MockClassLoader @77cf3f8b 加载的类 jdk.internal.reflect.ConstructorAccessorImpl 无法访问 jdk/internal/reflect 超类 jdk。 internal.reflect.MagicAccessorImpl
哪个版本可以解决这个问题?为了支持Java 11 maven-compiler-plugin 3.6.0。
java maven-plugin maven-surefire-plugin powermockito java-11