Powermock 无法使用模拟API对此类进行单元测试

Powermock 无法使用模拟API对此类进行单元测试,powermock,Powermock,这是一个遗留代码,我无法使用Powermock进行单元测试。请使用Powermock或任何其他方式帮助我进行以下单元测试: 必须对ServiceAPI类进行单元测试 public class ServiceAPI { public String getServiceKey(String serviceNumber){ String jndiUrl = getServURL(); return jndiUrl; } public Stri

这是一个遗留代码,我无法使用Powermock进行单元测试。请使用Powermock或任何其他方式帮助我进行以下单元测试:

必须对ServiceAPI类进行单元测试

public class ServiceAPI {

    public String getServiceKey(String serviceNumber){
        String jndiUrl = getServURL();
        return jndiUrl;
    }

    public String getServURL(){
        String url = ServiceLocator.getInstance().init();
        return url;
    }

}
public class ServiceLocator {

    private static ServiceLocator serviceLocator = new ServiceLocator();

    public static ServiceLocator getInstance(){
        return serviceLocator;
    }

    public String init(){
        return "Jndi Call has return fix name";
    }   

}
上面的类与下面的类有依赖关系,而下面的类必须被模仿

public class ServiceAPI {

    public String getServiceKey(String serviceNumber){
        String jndiUrl = getServURL();
        return jndiUrl;
    }

    public String getServURL(){
        String url = ServiceLocator.getInstance().init();
        return url;
    }

}
public class ServiceLocator {

    private static ServiceLocator serviceLocator = new ServiceLocator();

    public static ServiceLocator getInstance(){
        return serviceLocator;
    }

    public String init(){
        return "Jndi Call has return fix name";
    }   

}
我写了下面的测试

@RunWith(PowerMockRunner.class)
@PrepareForTest(ServiceLocator.class)
public class ServiceAPITest {

    @Test
    public void testGetServiceKey() {

        ServiceLocator serviceLocator = PowerMockito.mock(ServiceLocator.class);
        PowerMockito.mockStatic(ServiceLocator.class);
        PowerMockito.when(ServiceLocator.getInstance()).thenReturn(serviceLocator);
        PowerMockito.when(serviceLocator.init()).thenReturn("value");
        ServiceAPI serviceAPI = new ServiceAPI();
        serviceAPI.getServiceKey("20156");
    }

}

未获得o/p。请帮忙

您有什么问题?我不明白。这段代码工作正常,但不测试任何东西。您需要添加断言或验证块。实际上,它是大型代码的一部分,init()方法有一个jndi调用,当我尝试时,它没有返回模拟值。另外,我不明白我们是在模仿ServiceLocator两次,那么它到底是如何工作的呢?基于这个代码片段,很难猜出您的情况有什么错,因为它看起来很好,工作也很好。我看这里没有错。顺便说一下,您可能对这个测试框架感兴趣:。它可以用于与JNDI的集成测试。您可以了解PowerMock的工作原理。简而言之,您不会两次嘲笑ServiceLocator。或者更准确地说,您可以在不同的级别上模拟它:对象(实例)级别和类级别。在第一行中,您创建一个新的模拟ServiceLocator实例,然后将拦截器添加到该类的静态调用中。在
mockStatic
之后,Mockito可以像处理非静态调用一样处理静态调用。。谢谢你的回答,现在我也可以模拟真正的实现了。它不起作用了,因为那里没有更多的第三方jar,我错过了模拟那些依赖项的机会……非常感谢!你有什么问题?我不明白。这段代码工作正常,但不测试任何东西。您需要添加断言或验证块。实际上,它是大型代码的一部分,init()方法有一个jndi调用,当我尝试时,它没有返回模拟值。另外,我不明白我们是在模仿ServiceLocator两次,那么它到底是如何工作的呢?基于这个代码片段,很难猜出您的情况有什么错,因为它看起来很好,工作也很好。我看这里没有错。顺便说一下,您可能对这个测试框架感兴趣:。它可以用于与JNDI的集成测试。您可以了解PowerMock的工作原理。简而言之,您不会两次嘲笑ServiceLocator。或者更准确地说,您可以在不同的级别上模拟它:对象(实例)级别和类级别。在第一行中,您创建一个新的模拟ServiceLocator实例,然后将拦截器添加到该类的静态调用中。在
mockStatic
之后,Mockito可以像处理非静态调用一样处理静态调用。。谢谢你的回答,现在我也可以模拟真正的实现了。它不起作用了,因为那里没有更多的第三方jar,我错过了模拟那些依赖项的机会……非常感谢!