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

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.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类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对象。