2016-04-01 4 views
0

У меня есть метод ниже, для которого мне нужно написать модульные тесты. Но я не могу шпионить за классом KeyStore. Это исключает нижеследующее исключение.Как издеваться над классом хранилища ключей и назначать макет поведения его методам?

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

Я могу издеваться над этим. Но когда я перехожу к назначению поведения для макетных методов, он генерирует исключения. Методы, которые я назвал, и исключения, которые я получил, следующие.

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 

Ниже приведен метод, который я пытаюсь проверить.

 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 и его методы поведения? Пожалуйста посоветуй.

НОВЫЙ МЕТОД ИСПЫТАНИЯ С ИСПОЛЬЗОВАНИЕМ Mockito:

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

    } 

ответ

1

KeyStore является система класса (java.security.KeyStore). Вам нужно будет использовать подход для издевательских системных классов, как указано в powermock!

Code exemple

+0

я могу использовать powermock для насмехаясь статические методы классов системы. Как насчет этих нестатических методов, таких как load и getCertificates? – mayooran

+0

Вы можете сделать что-то вроде этого: PowerMockito.doReturn (keystoreMock) .when (KeyStore.class, «getInstance», anyString()); Класс сертификата является окончательным, и вам нужно также издеваться над ним с помощью powerermock. – abyversin

+0

Думал, что это сработало, на самом деле это не так. Его мошеннический объект, который я получаю, когда я прошу PowerMockito вернуть мне объект KeyStore. Я приложил метод тестирования. Пожалуйста, обратитесь к – mayooran

 Смежные вопросы

  • Нет связанных вопросов^_^