使用反射修改工具類里的final static 字段
單元測(cè)試遇到如下的代碼塊,因?yàn)閖dk的值是從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();
}
}
}
這個(gè)時(shí)候使用反射把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
測(cè)試私有方法
使用powermock的Whitebox.invokeMethod()方法可以調(diào)用對(duì)象的私有方法
//第一個(gè)參數(shù)為對(duì)象,第二個(gè)參數(shù)為該對(duì)象的私有方法名,后面的可變參數(shù)為傳入的參數(shù)
Whitebox.invokeMethod(demoRegisterService, "sendRegisterEvent", organizationDO, userDO, userDO, userDO)
如何mock在方法內(nèi)創(chuàng)建的對(duì)象
有如下類,在method()方法里,創(chuàng)建了一個(gè)Animal對(duì)象,返回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)新建對(duì)象的返回值。
//這里指定的類是
@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"
}
}