【发布时间】:2016-02-03 07:40:22
【问题描述】:
我有三个类A,B和C,其中A是抽象类,B也是抽象类,B扩展A,C是扩展B的非抽象类。我有一个名为AddressService addressService的变量,它在类中是公共的B 并且在 A 类中是私有的。我正在为非抽象类 C 编写一个测试用例,并调用 A 类和 A 类中的方法,我需要设置用于调用的 AddressService addressService 变量的值方法。 AddressService 是一个具有方法的接口,我正在调用我的超类 A 中的方法之一。以下是我的代码
public interface AddressService{
void test();
}
public abstract class A{
private AddressService addressService = (AddressService) ServiceLocatorBeanFactory.getService(AddressService.class);
public void createDocument(){
addressService . test();
}
}
public abstract class B extends A{
public AddressService addressService = (AddressService) ServiceLocatorBeanFactory.getService(AddressService.class);
}
public class C extends B {
}
这是我的测试课
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceLocatorBeanFactory.class})
public class createTest {
@SuppressWarnings("unchecked")
@Test
public void createTurnaroundDocument() throws Exception{
PowerMockito.mockStatic(ServiceLocatorBeanFactory.class);
AddressService addressService = Mockito.mock(AddressService.class);
PowerMockito.when(ServiceLocatorBeanFactory.getService(AddressService.class)).thenReturn(addressService);
C original = new C();
C handler = PowerMockito.spy(original);
handler.createDocument();
}
}
我尝试设置 A 类中存在的 AddressService addressService 的值,该值以多种方式抽象,但该值仍然为 null,我得到 NullPointer 异常。
以下是不同的方式
1.Whitebox.setInternalState(handler, AddressService.class, addressService);
当我以这种方式设置时,值未设置并且为 null 并给我 NullPointerException
2.MemberModifier.field(A.class, "addressService").set(A.class, addressService);
当我这样设置时,我得到以下异常
java.lang.IllegalArgumentException:无法将 AddressService 字段 A.addressService 设置为 java.lang.Class
3.Whitebox.setInternalState(A.class, AddressService.class, addressService);
当我这样设置时,我得到以下异常
org.powermock.reflect.exceptions.FieldNotFoundException:在 A 的类层次结构中找不到可从“AddressService”分配的静态字段。
4.Whitebox.setInternalState(A.class, "addressService", addressService);
当我这样设置时,我得到以下异常
org.powermock.reflect.exceptions.FieldNotFoundException: 在 A 的类层次结构中找不到名为“addressService”的静态字段。
有没有一种方法可以使用 Mockito 或 PowerMockito 设置超类中存在的私有变量的值。请帮忙
【问题讨论】:
标签: unit-testing junit mocking mockito powermockito