我试图模拟返回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()方法。
只需使用强大的模拟程序执行此操作,这似乎也可以正常工作。
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"));
}
}
@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));
}
}