java - 当spy()真实对象时,父类(super class)字段没有被分配任何值

标签 java unit-testing junit mockito powermock

以下是我的类(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/

相关文章:

java - void 方法的单元测试应该是什么样子?

java - junit中的TestRunner类使用哪种设计模式

java - 将服务器IP从wifi路由器提交到Android

java - 在 OpenFire 中刷新 VCard

java - 执行Java程序时出错: Could not find or load main class

java - 找出给定某些条件的 2D boolean 数组的所有可能组合(使用 Java)

unit-testing - 用于单元测试的 TestDrive.net 'Visual Studio add in' 的开源替代方案?

javascript - 在 Jest 中使用 toBeCalledWith() 测试参数

angular - 库中的单元测试组件时生成的测试失败

java - 在 JUnit 测试用例中使用不同的数据子集测试不同的方法