2016-04-01 30 views
0

Aşağıdaki birim için birim testlerini yazmam gerekiyor. Ama ben KeyStore sınıfını göz ardı edemiyorum. Aşağıdaki istisna atar.Anahtar deposu sınıfı ile alay etmek ve yöntemlerine alay davranışı nasıl atar?

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

Bununla dalga geçebilirim. Ancak, sahte yöntemlerin davranışını atamaya gittiğimde istisnalar atar. Aradığım yöntemler ve aldığım istisnalar şu şekildedir.

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 

Test etmeye çalıştığım yöntem aşağıdadır.

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

KeyStore ve yöntem davranışlarıyla nasıl alay edebilirim? Lütfen tavsiye. Mockito KULLANMA

YENİ TEST METODU:

@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); 

    } 

cevap

1

KeyStore Sistem sınıfı (java.security.KeyStore) 'dir. powermock ile belirtilen alay sistem sınıfları için yaklaşımı kullanmanız gerekecektir!

Code exemple

+0

Ben sistem sınıflarının statik yöntemleri alay için powermock kullanabilirsiniz. Yük ve getCertificates gibi bu statik olmayan yöntemlere ne dersiniz? – mayooran

+0

Böyle bir şey yapabilirsiniz: PowerMockito.doReturn (keystoreMock) .when (KeyStore.class, "getInstance", anyString()); Sertifika sınıfı final ve powermock ile de alay etmeniz gerekiyor. – abyversin

+0

Çalıştığını düşündüm, aslında yoktu. PowerMockito'dan bana KeyStore nesnesini iade etmesini istediğimde aldığım sahte nesne. Test yöntemini ekledim. Lütfen – mayooran