Java 如何模拟keystore.getInstance()返回keystore对象?
我尝试模拟KeyStore.getInstance(),它返回KeyStore对象 下面是我累了的代码 Junit:Java 如何模拟keystore.getInstance()返回keystore对象?,java,junit,mockito,powermockito,Java,Junit,Mockito,Powermockito,我尝试模拟KeyStore.getInstance(),它返回KeyStore对象 下面是我累了的代码 Junit: KeyStore keyStoreMock = PowerMockito.mock(KeyStore.class); PowerMockito.when(KeyStore.getInstance(any())).thenReturn(keyStoreMock); PowerMockito.doNothing().when(keyStoreMock).load(any(Inpu
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类mock对象的名称
源代码:
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,如何克服这个问题
Colud any one plz帮助我模拟keystore.getInstance()方法 刚刚用power mock执行了这个,它似乎也能工作
@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));
}
}
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"));
}
}
可以标记为重复,这个问题已经在这里得到了回答@praveenkumermekala actullay我已经尝试了ref-link,但是我无法在PrepareForTestadd RunWith之前模拟KeyStore.getInstance()方法将@PrepareTest改为PrepareForTest并将PowerMockito.mock(KeyStore.class)改为PowerMockito.mockStatic(KeyStore.class)(PowerMockRunner.class)注释和try@PraveenKumarMekala我按照上面的更新进行了更新,但我也无法模拟keystore.getInstance()方法,该方法使用any()而不是anyString()返回keystore objecttrusted?谢谢你的更新,但它也不起作用。它返回原始密钥库对象。我不理解这一部分,原始密钥库是什么意思。我的意思是keyStore.getInstance没有返回keystoremock。你能告诉我是如何确定的,以便我查看它吗?为了确定,我添加了断言。它们返回mock不是吗?他们给我通过了!尝试了上面两段代码,但无法模拟KeyStore.getInstance.it返回原始KeyStore对象。