如何模拟返回keystore对象的keystore.getInstance()?

问题描述 投票:-1回答:2

我试图模拟返回keyStore对象的KeyStore.getInstance()这里下面的代码我很累,

[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类模拟对象的keyStore.getInstance()。

源代码:

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()方法。

java junit mockito powermockito
2个回答
0
投票

只需使用强大的模拟程序执行此操作,这似乎也可以正常工作。

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
投票
@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));        
    }         
}
© www.soinside.com 2019 - 2024. All rights reserved.