Как смоделировать keystore.getInstance (), который возвращает объект хранилища ключей? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытался смоделировать KeyStore.getInstance (), который возвращает здесь объект keyStore, код ниже, который я устал,

Junit:

KeyStore keyStoreMock = PowerMockito.mock(KeyStore.class); 
PowerMockito.when(KeyStore.getInstance(any())).thenReturn(keyStoreMock); 
PowerMockito.doNothing().when(keyStoreMock).load(any(InputStream.class),Mockito.any(char[].class)); 
X509Certificate cert = Mockito.mock(X509Certificate.class); 
when(keyStoreMock.getCertificate(any())).thenReturn(cert); 
when(cert.getNotAfter()).thenReturn(mockDate);

невозможно смоделировать keyStore.getInstance (), который возвращает фиктивный объект класса KeyStore.

Исходный код:

KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(new FileInputStream(filename), password.toCharArray());
X509Certificate certificate = (X509Certificate)keystore.getCertificate("Cert_name");  
endate = certificate.getNotAfter();

Я думаю, KeyStore.getInstance () возвращаетnull, как преодолеть эту проблему.

Может кто-нибудь, пожалуйста, помогите мне высмеивать метод keystore.getInstance ().

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Только что выполнил это с помощью mock, похоже, это тоже работает.

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.util.Date;

import static org.mockito.Matchers.any;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;

@PrepareForTest(KeyStore.class)
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*", "javax.security.*"})
public class MyKeyTest {
  @Test
  public void mockKeyStore() throws Exception{
    KeyStore keyStoreMock = mock(KeyStore.class);
    PowerMockito.mockStatic(KeyStore.class, invocation -> keyStoreMock);
    when(KeyStore.getInstance(any())).thenReturn(keyStoreMock);
    PowerMockito.doNothing().when(keyStoreMock).load(any(InputStream.class), any(char[].class));
    X509Certificate cert = Mockito.mock(X509Certificate.class);
    when(keyStoreMock.getCertificate(any())).thenReturn(cert);
    when(cert.getNotAfter()).thenReturn(new Date());
    Assert.assertEquals(keyStoreMock,KeyStore.getInstance("x"));
    Assert.assertEquals(keyStoreMock,KeyStore.getInstance("y"));
    Assert.assertEquals(keyStoreMock,KeyStore.getInstance("MarbleCake"));
  }
}
0 голосов
/ 27 сентября 2019
@Runwith(PowerMockRunner.class)
@PrepareForTest(KeyStore.class)
public class TestClass {

    @InjectMock
    //Actual Class
    @Mock
    KeyStore mockKeyStore;

    @Test
    public void test() {
        KeyStore keyStoreMock = PowerMockito.mockStatic(KeyStore.class);
        PowerMockito.when(keyStore.getInstance(any())).thenReturn(mockKeyStore);//use this line or
        //use below two lines
        KeyStore powerMockKey = PowerMockito.mock(KeyStore.class);
        Mockito.when(KeyStore.getInstance(anyString())).thenReturn(powerMockKey));        
    }         
}
...