【问题标题】:Jsch mock Java - Mockito/ PowerMockitoJsch 模拟 Java - Mockito/PowerMockito
【发布时间】:2020-12-16 02:38:17
【问题描述】:

我正在尝试为以下代码编写单元测试,但遇到了困难。请帮忙。我不确定如何编写测试,尤其是围绕返回 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();
}

【问题讨论】:

  • 对这段代码的单元测试应该模拟 JSch 并验证它在不同条件下以您期望的方式调用。
  • 我写了这段代码,但是在调用 addIdentity 方法时失败了 mockJsch = Mockito.mock(JSch.class); whenNew(JSch.class).withNoArguments().thenReturn(mockJsch);
  • 将您的代码添加到您的问题中,以及确切的错误消息/堆栈跟踪

标签: java unit-testing mockito powermockito


【解决方案1】:

模拟JSch 不会帮助您完成当前的实现,因为您总是使用new 创建JSch 的新实例。这样,您目前没有机会从外部传递 JSch 的模拟版本。

更好的方法是将JSch 的实例作为A 的构造函数的一部分传递。这使您可以灵活地在测试时传递JSch 的任何实例。对于运行时,您可以使用依赖注入框架(例如,作为 Jakarta EE/Microprofile/Quarkus 一部分的 Spring 或 CDI)来注入一个实例(在您声明一个之后)。

你可以重构你的类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 的模拟实例传递给您的测试类 (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。

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多