2016-04-01 2 views
0

Ich habe die folgende Methode, für die ich Komponententests schreiben muss. Aber ich kann die Klasse KeyStore nicht ausspionieren. Es löst die folgende Ausnahme aus.Wie Keystore-Klasse mockt und ihren Methoden Pseudo-Verhalten zuweisen?

org.mockito.exceptions.base.MockitoException: Unable to create mock instance of type 'KeyStore' 

Ich kann es aber verspotten. Aber wenn ich das Verhalten für die Mock-Methoden zuweisen will, löst es Ausnahmen aus. Methoden, die ich anrief und die Ausnahmen, die ich bekam, sind wie folgt.

when(keyStoreMock.getCertificate(anyString())).thenReturn(certificateMock); 

java.security.KeyStoreException: Uninitialized keystore 

doNothing().when(keyStoreMock).load(any(InputStream.class),Mockito.any(char[].class)); 

java.lang.NullPointerException 

Unten ist die Methode, die ich versuche zu testen.

 public boolean verifySignature(String filePath, String extractContentsPath, String csvParams) 
       throws ServiceSDKException { 
      boolean result = false; 
      String typeOfCertificateStore = ""; 
      String certificateStoreProvider = ""; 
      String certificateName = ""; 
      SignerInformationVerifier verifier = null; 
      if (filePath != null && extractContentsPath != null && csvParams != null && !filePath.isEmpty() 
        && !extractContentsPath.isEmpty() && !csvParams.isEmpty()) { 
       try { 
        String[] receivedParams = csvParams.split(","); 
        typeOfCertificateStore = receivedParams[0]; 
        certificateStoreProvider = receivedParams[1]; 
        certificateName = receivedParams[2]; 
       } catch (ArrayIndexOutOfBoundsException e) { 
        throw new ServiceSDKException("csvParams should have type of certificate store, certificate store provider and certificate name respectively", e); 
       } 
       try { 
        Path signedDataFilePath = Paths.get(filePath); 
        Path pathToExtractContents = Paths.get(extractContentsPath); 

        KeyStore msCertStore = KeyStore.getInstance(typeOfCertificateStore, certificateStoreProvider); 
        msCertStore.load(null, null); 
        try { 
         verifier = new JcaSimpleSignerInfoVerifierBuilder() 
           .setProvider(certificateStoreProvider) 
           .build(((X509Certificate) msCertStore.getCertificate(certificateName))); 
        } catch (Exception e) { 
         throw new ServiceSDKException("Exception occurred when building certificate",e); 
        } 
        verify(signedDataFilePath, pathToExtractContents, verifier); 
        result = true; 
       } catch (KeyStoreException | NoSuchProviderException | IOException | NoSuchAlgorithmException 
         | CertificateException e) { 
        result = false; 
        throw new ServiceSDKException("Exception occurred while preparing to verify signature " , e); 
       } 
      } else { 
       throw new ServiceSDKException("FilePath,extract contents path or csv params cannot be empty or null"); 
      } 
      return result; 
     } 

Wie kann ich KeyStore und seine Methoden verhalten? Bitte um Rat.

NEUE METHODE Mockito weiter verwenden:

@PrepareForTest(KeyStore.class) 
    @Test 
    public void should_verify_signature_when_verifySignature_called_with_fileName_and_certificate_details_in_verifySignature_method() throws Exception { 
     PowerMockito.mockStatic(KeyStore.class); 

     KeyStore keyStoreMock = PowerMockito.mock(KeyStore.class); 
     PowerMockito.when(KeyStore.getInstance(anyString())).thenReturn(keyStoreMock); 
     Mockito.doNothing().when(keyStoreMock).load(any(InputStream.class), Mockito.any(char[].class)); 
     Certificate certificateMock = Mockito.mock(Certificate.class); 
     when(keyStoreMock.getCertificate(anyString())).thenReturn(certificateMock); 

     PowerMockito.when(KeyStore.getInstance("Windows-MY", "MoonMSCAPI")).thenReturn(keyStoreMock); 
     boolean result = signatureUtil.verifySignature("src//test//java//Updates.zip.signed.pkcs7" 
       , "src//test//java//Updates-retrieved.zip", "Windows-MY,MoonMSCAPI,Software View Certificate Authority"); 
     Assert.assertTrue(result); 

    } 

Antwort

1

Keystor ist eine System-Klasse (java.security.KeyStore). Sie müssen den Ansatz verwenden, um Systemklassen zu verspotten, wie mit powermock angegeben!

Code exemple

+0

kann ich PowerMock für spöttische statische Methoden der Systemklassen verwenden. Was ist mit diesen statischen Methoden wie load und getCertificates? – mayooran

+0

Sie können so etwas tun: PowerMockito.doReturn (keystoreMock) .when (KeyStore.class, "getInstance", anyString()); Zertifikat-Klasse ist endgültig und Sie müssen es auch mit PowerMock verspotten. – abyversin

+0

Dachte, es hat funktioniert, eigentlich war es nicht. Es ist das Mock-Objekt, das ich bekomme, wenn ich PowerMockito anrufe, mir das KeyStore-Objekt zurückzugeben. Ich habe die Testmethode beigefügt. Bitte beachten Sie – mayooran

Verwandte Themen