2014-10-16 46 views
2

有没有什么办法可以放心使用PowerMock,因为当我试图用放心的方式测试一个RESTful API时。使用PowerMock在休息放心的测试中嘲笑静态类

我想给PowerMock一个静态调用。

操作的代码:

@POST 
@Produces("application/json") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response createEntity(@Context HttpHeaders hh, String body) { 
    . . . 

    String sec = MDI.check(Some_string, ..., ...); 
    if (sec == null) throw ... 

    return Response.... 
} 

而且测试:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MDI.class) 
public class createSOTest { 

    @Test 
    public void testStatic() { 
     mockStatic(MDI.class); 

     expect(MDI.check(Some_string, ..., ...).andReturn(Some_String); 
     replay(MDI.class) 

     given(). 
      contentType(ContentType.JSON). 
      header("SomeHeader", "something"). 
      body(root). 
     when(). 
      post("/"). 
     then(). 
      statusCode(...); 
    } 
} 

的问题是,我得到一个异常时,测试尝试运行rest-assured代码(given()....):

org.apache.http.conn.ssl.SSLInitializationException: class configured for SSLContext: sun.security.ssl.SSLContextImpl$TLS10Context not a SSLContext 
    at org.apache.http.conn.ssl.SSLContexts.createDefault(SSLContexts.java:58) 
    at org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory(SSLSocketFactory.java:162) 
    at org.apache.http.impl.conn.SchemeRegistryFactory.createDefault(SchemeRegistryFactory.java:52) 
    at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:305) 
    at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:465) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324) 
    at org.codehaus.groovy.runtime.metaclass.MethodMetaProperty$GetBeanMethodMetaProperty.getProperty(MethodMetaProperty.java:73) 
    at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:61) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227) 
    at com.jayway.restassured.internal.RequestSpecificationImpl.applyProxySettings(RequestSpecificationImpl.groovy:1794) 

这似乎是的问题。

回答

5

我遇到同样的问题,并找到解决方法上this blog

这涉及到从上游的类加载器加载的SSLContext东西 - 这是电力模拟的一个运行测试时。

解决方案:在您的测试类的顶部使用@PowerMockIgnore注释:

@PowerMockIgnore

0

这看起来不像powermock问题。通过临时删除被测试代码中的静态依赖关系来缩小它的范围 - 将其存储,以便返回任何内容。再次尝试没有任何嘲笑的测试。您可能会得到相同的错误,在这种情况下您可以调查该错误。

+0

喜@阿什利 - 楣,没有任何嘲笑我没有错误。但我想嘲笑静态方法... – 2014-10-16 12:52:47

1

奥斯卡的答案是非常有帮助的( “javax.net.ssl中*”)。我不得不排除多个名称空间才能使其工作。 我最终得到它本通:

@PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.http.conn.ssl.*", "javax.net.ssl.*"})