模拟调用静态外部方法的JavaWeb服务Rest

模拟调用静态外部方法的JavaWeb服务Rest,java,web-services,jersey,mocking,powermock,Java,Web Services,Jersey,Mocking,Powermock,我想对web服务(Rest-jersey)进行单元测试,这就是我的web服务的外观 public class WebService { public string webServiceMethode { ... String a = ExternalClass.staticMethode("aa"); .. return b }

我想对web服务(Rest-jersey)进行单元测试,这就是我的web服务的外观

public class WebService {

        public string webServiceMethode {
               ...
               String a =   ExternalClass.staticMethode("aa");
               ..
              return b

           }
    }
正如您可以看到的,web服务方法调用外部类中的静态方法,在测试类中,我的想法是通过Rest Assured调用web服务,并通过Powermock模拟静态方法,这里是我的测试方法逻辑

public class WebServicetest {
      @Test
      public void testWebServiceMethode {
               mockStatic(ExternalClass.class);
               when(ExternalClass.staticMethode(Mockito.any()))
                                   .thenReturn("ok");
              given().accept(CotentType.JSON)
              .body(MyObject).when().post(new URI("/test"));
    }
  }
给定的()方法将调用web服务和when()。theReturn()将替换外部静态方法的返回,因此调用工作正常,而不是模拟

提前感谢您的帮助

A)了解静态在良好的OOP中是一种异常。它消除了多态性,并导致类之间的超紧密耦合。明智的做法是:避免以这种方式使用static

静态测试也可以,但一旦它妨碍了您进行(简单的)单元测试的能力,您就做错了

所以,我的第一个答案是:摆脱静态方法

B) 如果您想继续做错误的事情(使用PowerMock),只需阅读或。为了使静态模拟工作正常进行,有各种各样的要求。您需要使用@Runner(PowerMockRunner),并且需要使用@PrepareForTest注释(对于要模拟静态类的类)。因此,PowerMock可以进入并操作生产代码的字节码,从而发挥其神奇的作用