以下是我的类(class)
class Parent{
private AddressService addressService = ServiceLocator.getService(AddressService.class);
protected void doSomeJob(){
addressService.doThat();
}
}
class Child extends Parent{
protected void doSomeJob(){
super.doSomeJob();
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceLocator.class})
class ChildTest{
@Test
public void doSomeJob(){
PowerMockito.mockStatic(ServiceLocator.class);
AddressService addressService = Mockito.mock(AddressService.class);
PowerMockito.when(ServiceLocator.getService(AddressService.class)).thenReturn(addressService);
Child original = new Child();
Child spiedObj = PowerMockito.spy(original);
spiedObj.doSomeJob();
}
}
这里ServiceLocator.getService()
是一个静态方法,它从应用程序上下文中查找并返回bean。因此,我模拟了该静态类,并要求在请求 ServiceLocator.getService(AddressService.class)
时返回 AddressService.class
实例。
对于我的单元测试,当我 spy()/mock()
子类时,addressSerive 实例尚未分配任何值。但是,当我使用 new
运算符创建实例时,我可以看到模拟 AddressService
已分配给该字段。我在这里缺少什么以及当我在其子实例上执行 spy ()操作时如何为该父字段分配值?
谢谢
最佳答案
因为我没有看到任何答案,所以我尝试遵循并且效果很好(我试图避免这样做)
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceLocator.class})
class ChildTest{
@Test
public void doSomeJob(){
PowerMockito.mockStatic(ServiceLocator.class);
AddressService addressService = Mockito.mock(AddressService.class);
// commented as no more required
// PowerMockito.when(ServiceLocator.getService(AddressService.class)).thenReturn(addressService);
Child original = new Child();
Child spiedObj = PowerMockito.spy(original);
// using Whitebox API
Whitebox.setInternalState(spiedObj, AddressService.class, addressService);
spiedObj.doSomeJob();
}
}
这里我使用了Whitebox
API来设置成员变量。
关于java - 当spy()真实对象时,父类(super class)字段没有被分配任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22140213/