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();}}