2013-08-22 13 views
6

के साथ समस्याएं पैदा कर रहा है मुझे PrepareForTest एनोटेशन के साथ कुछ परेशानी हो रही है और एक AmazonSQSClient का एक नया उदाहरण बना रहा है।PowerMock PrepareForTest एनोटेशन अमेज़ॅन SQSClient कन्स्ट्रक्टर

मैं जेनकींस प्लगइन लिख रहा हूं और दुर्भाग्यवश यह सुनिश्चित करने के लिए FormValidation स्थैतिक वर्ग को नकल करने की आवश्यकता है ताकि मेरी प्लगइन के फील्ड सत्यापन पर चेतावनी और त्रुटि संदेश उत्पन्न हो सकें। लेकिन जब AmazonSQSClient का उदाहरण बनाकर मैं एक org.apache.http.conn.ssl.SSLInitializationException

मैं इसे एक बहुत ही सरल उदाहरण के लिए नीचे निकाला गया है, यहाँ अपने परीक्षण फ़ाइल है मिलती है:

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(); 
    } 
} 

इस कोड को मैं निम्नलिखित त्रुटि मिलती चल पर:

<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> 
:
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 

आदेश का निर्माण और यह जल्दी से यहां चलाने के लिए इच्छुक किसी को मदद करने के लिए मेरी pom.xml फ़ाइल है

जब एनोटेशन @PrepareForTest(Foo.class) विधि से हटा दिया जाता है तो परीक्षण ठीक चलता है।

मैं सोच रहा था कि कोई यह समझा सकता है कि यह क्यों हो रहा है और यदि इसके लिए कोई काम है या FormValidation कक्षा का मज़ाक उड़ाने से बचने का तरीका है?

धन्यवाद।

+0

हाय सारा, आप अंततः अगर छुटकारा पाने के लिए सक्षम थे यह गलती? मुझे अभी भी एक ही समस्या का सामना करना पड़ रहा है, इस पर ऑनलाइन अधिक सहायता पाने में असमर्थ। –

उत्तर

11

अपनी कक्षा

+2

हाय मुझे सारा के समान समस्या है। मुझे annotion जोड़ने की कोशिश की आप सुझाव है और मैं: com.amazonaws.AmazonClientException: java.security.NoSuchAlgorithmException: default एसएसएल संदर्भ तक पहुँचने के लिए की वजह से असमर्थ वर्ग SSLContext के लिए कॉन्फ़िगर: sun.security.ssl.SSLContextImpl $ DefaultSSLContext एक SSLContext नहीं –

+0

उपर्युक्त काम नहीं करता है। मुझे लगता है कि मुझे अन्य पैकेजों को भी अनदेखा करना होगा। मैंने PowerMock का उपयोग किए बिना इस परीक्षण को किसी अन्य वर्ग में स्थानांतरित करने का निर्णय लिया। – Dhiraj

3

@ नटाली पहले से ही उल्लेख किया है, आप @PowerMockIgnore() टिप्पणी के साथ काम कर सकते हैं करने के लिए @PowerMockIgnore("org.apache.http.conn.ssl.*") टिप्पणी जोड़ने के लिए प्रयास करें। हो सकता है आप संकुल की अनदेखी करने की जरूरत है javax.net.ssl.* और/या javax.crypto.*:

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

आप यहाँ कुछ पृष्ठभूमि जानकारी प्राप्त कर सकते हैं:

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

संबंधित मुद्दे