2013-08-22 56 views
6

Tôi đang gặp sự cố với chú thích PrepareForTest và tạo một phiên bản mới của AmazonSQSClient.Chú thích PowerMock PrepareForTest gây ra sự cố với hàm tạo AmazonSQSClient

Tôi đang viết một trình cắm Jenkins và không may cần phải giả lập lớp tĩnh FormValidation để đảm bảo rằng các cảnh báo và thông báo lỗi được tạo ra trên xác nhận trường của plugin của tôi. Tuy nhiên khi tạo một thể hiện của AmazonSQSClient tôi nhận được một org.apache.http.conn.ssl.SSLInitializationException

Tôi đã trừu tượng hóa nó xuống một ví dụ rất đơn giản, đây là tập tin thử nghiệm của tôi:

package com.test; 

import com.amazonaws.services.sqs.AmazonSQS; 
import com.amazonaws.services.sqs.AmazonSQSClient; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
public class SQSTest { 

    // This is for mimicking the mocking of FormValidation 
    private static class Foo {} 

    @Test 
    @PrepareForTest(Foo.class) 
    public void buildTest() 
    { 
     AmazonSQS sqs = new AmazonSQSClient(); 
    } 
} 

On chạy mã này tôi nhận được lỗi sau:

org.apache.http.conn.ssl.SSLInitializationException: Failure initializing default SSL context 
    at org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:360) 
    at org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory(SSLSocketFactory.java:175) 
    at org.apache.http.impl.conn.SchemeRegistryFactory.createDefault(SchemeRegistryFactory.java:49) 
    at org.apache.http.impl.conn.PoolingClientConnectionManager.<init>(PoolingClientConnectionManager.java:93) 
    at com.amazonaws.http.ConnectionManagerFactory.createPoolingClientConnManager(ConnectionManagerFactory.java:26) 
    at com.amazonaws.http.HttpClientFactory.createHttpClient(HttpClientFactory.java:87) 
    at com.amazonaws.http.AmazonHttpClient.<init>(AmazonHttpClient.java:121) 
    at com.amazonaws.AmazonWebServiceClient.<init>(AmazonWebServiceClient.java:66) 
    at com.amazonaws.services.sqs.AmazonSQSClient.<init>(AmazonSQSClient.java:189) 
    at com.amazonaws.services.sqs.AmazonSQSClient.<init>(AmazonSQSClient.java:93) 
    at com.test.SQSTest.buildTest(SQSTest.java:19) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:101) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: java.security.NoSuchAlgorithmException: class configured for KeyManagerFactory: sun.security.ssl.KeyManagerFactoryImpl$SunX509 not a KeyManagerFactory 
    at sun.security.jca.GetInstance.checkSuperClass(GetInstance.java:258) 
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:237) 
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:164) 
    at javax.net.ssl.KeyManagerFactory.getInstance(KeyManagerFactory.java:138) 
    at org.apache.http.conn.ssl.SSLSocketFactory.createSSLContext(SSLSocketFactory.java:223) 
    at org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:358) 
    ... 42 more 

nhằm giúp bất cứ ai muốn để xây dựng và chạy này một cách nhanh chóng ở đây là tập tin pom.xml của tôi:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.test</groupId> 
    <artifactId>test.sqs</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>hpi</packaging> 



    <properties> 
     <!-- 
      explicitly specifying the latest version here because one we get from the parent POM 
      tends to lag behind a bit 
     --> 
     <maven-hpi-plugin.version>1.96</maven-hpi-plugin.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.amazonaws</groupId> 
      <artifactId>aws-java-sdk</artifactId> 
      <version>1.5.4</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.11</version> 
     </dependency> 

     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>1.9.5</version> 
     </dependency> 

     <dependency> 
      <groupId>org.powermock</groupId> 
      <artifactId>powermock-api-mockito</artifactId> 
      <version>1.5.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.powermock</groupId> 
      <artifactId>powermock-module-junit4</artifactId> 
      <version>1.5.1</version> 
     </dependency> 

    </dependencies> 
</project> 

Khi chú thích @PrepareForTest(Foo.class) bị xóa khỏi phương pháp thử nghiệm chạy tốt.

Tôi đã tự hỏi nếu ai đó có thể giải thích lý do tại sao điều này xảy ra và nếu có một công việc xung quanh cho nó hoặc một cách để tránh chế nhạo lớp FormValidation?

Cảm ơn.

+0

Hi Sarah, Were Bạn có thể cuối cùng đã thoát khỏi nếu lỗi này? Tôi đang đối mặt với cùng một vấn đề ngay bây giờ, không thể tìm thấy nhiều trợ giúp trực tuyến về điều này. –

Trả lời

11

Cố gắng thêm @PowerMockIgnore("org.apache.http.conn.ssl.*") chú thích để lớp học của bạn

+2

Xin chào, tôi có cùng một vấn đề với Sarah. Tôi đã cố gắng thêm annotion bạn đề nghị và tôi nhận được: com.amazonaws.AmazonClientException: Không thể truy cập vào bối cảnh SSL mặc định Nguyên nhân: java.security.NoSuchAlgorithmException: lớp cấu hình cho SSLContext: sun.security.ssl.SSLContextImpl $ DefaultSSLContext không phải là SSLContext –

+0

Ở trên không hoạt động. Tôi nghĩ rằng tôi cần phải bỏ qua các gói khác quá. Tôi quyết định chuyển bài kiểm tra này vào một lớp khác mà không cần sử dụng PowerMock. – Dhiraj

3

Như @Natalie đã đề cập, bạn có thể làm việc với các @PowerMockIgnore() chú thích. Có lẽ bạn cần phải bỏ qua các gói javax.net.ssl.* và/hoặc javax.crypto.*:

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

Bạn có thể nhận được ở đây một số thông tin cơ bản:

https://groups.google.com/forum/#!topic/powermock/v4nreP2AnOQ

This is most likely because SSLContext is loaded by the bootstrap classloader and PowerMock cannot byte-code manipulate these classes. You have to use this approach to mock that method. /Johan Haleby