使用反射修改工具類里的final static 字段
單元測試遇到如下的代碼塊掸驱,因為jdk的值是從System.getProperty("java.version")
里獲取的润讥,所以一直是1.8版本jdk
public class FieldHelper {
private static final IFieldHelper fieldHelperInterface;
static {
String version = System.getProperty("java.version");
if (version.contains("1.8.")) {
fieldHelperInterface = new Jdk8FieldHelper();
} else {
fieldHelperInterface = new Jdk6or7FieldHelper();
}
}
}
這個時候使用反射把fieldHelperInterface
字段修改掉即可
Field field = FieldHelper.class.getDeclaredField("fieldHelperInterface")
field.setAccessible(true)
Field modifiersField = Field.class.getDeclaredField("modifiers")
modifiersField.setAccessible(true)
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL)
FieldHelper.IFieldHelper fieldHelperInterface = new FieldHelper.Jdk6or7FieldHelper()
field.set(null, fieldHelperInterface)
PowerMock mock static method
測試私有方法
使用powermock
的Whitebox.invokeMethod()
方法可以調(diào)用對象的私有方法
//第一個參數(shù)為對象腕扶,第二個參數(shù)為該對象的私有方法名销睁,后面的可變參數(shù)為傳入的參數(shù)
Whitebox.invokeMethod(demoRegisterService, "sendRegisterEvent", organizationDO, userDO, userDO, userDO)
如何mock在方法內(nèi)創(chuàng)建的對象
有如下類,在method()
方法里来吩,創(chuàng)建了一個Animal對象俐银,返回name
public class User {
public String method (){
Animal animal = new Animal("dog");
return animal.getName();
}
}
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
由于方法體內(nèi)使用硬編碼dog
創(chuàng)建的用戶,所以返回值是dog理逊,如果我們想改變animal.getName()
的返回值橡伞,可以使用PowerMockito.whenNew
指定方法內(nèi)新建對象的返回值。
//這里指定的類是
@PrepareForTest(User.class)
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
class GatewayHelperSpec extends Specification {
def "test"() {
given:
def animal = Mock(Animal)
PowerMockito.whenNew(Animal.class).withAnyArguments().thenReturn(animal)
animal.getName() >> "cat"
User user = new User()
when:
def result = user.getName()
then:
result=="cat"
}
}