SpringBoot PowerMockito 私有/静态/方法/属性
- 1 PrepareForTest
- 2 待测试类
- 3 测试类
1 PrepareForTest
@PrepareForTest 是 PowerMockito 提供的一个注解,用于告诉 PowerMockito 哪些类需要被修改以允许使用 PowerMockito 的功能。
PowerMockito 主要用于修改 Java 类的行为,包括模拟静态方法、私有方法、构造函数等。但是,由于 Java 类加载器的限制,有些类可能无法直接被修改。因此,需要在测试类中使用 @PrepareForTest 注解来声明需要修改的类,以便 PowerMockito 能够正确地加载和修改这些类。
@PrepareForTest 注解可以指定需要修改的类,可以是一个或多个类,也可以是一个包下的所有类。PowerMockito 将会修改这些类的加载器,以确保可以对其进行修改。
2 待测试类
package com.xu.test.service.impl;import com.xu.test.service.JunitTestService;
import org.springframework.stereotype.Service;@Service
public class JunitTestServiceImpl implements JunitTestService {private String mockPrivate = "Private";private static String mockStatic = "Static";@Overridepublic String test(String a) {return a.concat(" Mockito");}public void mockMain() {System.out.println(mockPrivate);System.out.println(mockStatic);System.out.println(mockPublic());System.out.println(mockPrivate());System.out.println(mockFinal());System.out.println(mockStatic());}public String mockPublic() {return "PowerMockito Public";}public static String mockStatic() {return "PowerMockito Private";}private String mockPrivate() {return "PowerMockito Private";}public final String mockFinal() {return "PowerMockito Final";}}
3 测试类
package com.xu.test;import com.xu.test.service.impl.JunitTestServiceImpl;
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 org.powermock.reflect.Whitebox;import java.lang.reflect.Field;@RunWith(PowerMockRunner.class)
@PrepareForTest({JunitTestServiceImpl.class, Thread.class})
public class MockTest3 {@Testpublic void testMock1() throws Exception {JunitTestServiceImpl impl = PowerMockito.spy(new JunitTestServiceImpl());PowerMockito.doReturn("PowerMockito Public").when(impl, "mockPublic");PowerMockito.doReturn("PowerMockito Private").when(impl, "mockPrivate");PowerMockito.doReturn("PowerMockito Final").when(impl, "mockFinal");// 私有属性Whitebox.setInternalState(impl, "mockPrivate", "Private-");// 静态属性Field field = JunitTestServiceImpl.class.getDeclaredField("mockStatic");field.setAccessible(true);field.set(field, "newValue");//mock 静态方法PowerMockito.mockStatic(JunitTestServiceImpl.class);PowerMockito.doReturn("PowerMockito Static").when(JunitTestServiceImpl.class, "mockStatic");impl.mockMain();}}