簡體   English   中英

Jsch 模擬 Java - Mockito/PowerMockito

[英]Jsch mock Java - Mockito/ PowerMockito

我正在嘗試為以下代碼編寫單元測試並且遇到困難。 請幫忙。 我不確定如何編寫測試,尤其是圍繞返回 void 的方法,如 addIdentity() 和 connect()。 我正在使用 Mockito 和 powerMockito 框架。

public class A {

public method1() {
//some code here
method2();
//more code here
} 

private void method2() {
JSch jsch = new JSch();
Session jschSession = null;
    try {
        jsch.addIdentity("key");
        jschSession = jsch.getSession("userID", "somedomain", 22);
        //jsch code
        }
    }    
}

這就是我的測試的樣子:

@Test
public void my_Test() throws JSchException {    
    A test = new A();
    JSch mockJsch = Mockito.mock(JSch.class);
    whenNew(JSch.class).withNoArguments().thenReturn(mockJsch);
    test.method1();
}

Mocking JSch不會幫助您完成當前的實現,因為您總是使用 new 創建JSchnew實例。 這樣,您目前沒有機會從外部傳遞JSch的模擬版本。

更好的方法是將JSch的實例作為A的構造函數的一部分傳遞。 這使您可以靈活地在測試時傳遞任何JSch實例。 對於運行時,您可以使用依賴注入框架(例如 Spring 或 Jakarta EE/Microprofile/Quarkus 的一部分的 CDI)來注入一個實例(在您聲明一個之后)。

您可以重構您的 class A ,如下所示:

public class A {

  private final JSch jsch;

  public A (Jsch jsch) {
    this.jsch = jsch;
  }

  public method1() {
    //some code here
    method2();
    //more code here
 } 

  private void method2() {
    com.jcraft.jsch.Session jschSession = null;
    try {
        jsch.addIdentity("key");
        jschSession = jsch.getSession("userID", "somedomain", 22);
        jschSession.setConfig("StrictHostKeyChecking", "no");
        jschSession.connect();
        Channel channel = jschSession.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpObj = (ChannelSftp) channel;
        sftpObj.exit();
        jschSession.disconnect();
      }
   }    
}

然后您可以將Jsch的模擬實例傳遞給您的 class 正在測試( A ),並完全控制Jsch的行為

@Test
public void my_Test() throws JSchException {   
    JSch mockJsch = Mockito.mock(JSch.class); 
    A test = new A(mockJsch);
    when(mockJsch.getSession("", "").thenReturn(yourSession);
    test.method1();
}

此測試無需使用 PowerMock,我寧願只使用 JUnit 和 Mockito。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM