代码之家  ›  专栏  ›  技术社区  ›  amadain

模拟不返回任何内容的casted对象时的ClassCastException

  •  1
  • amadain  · 技术社区  · 7 年前

    我试图模拟(使用mock I to)一个具有以下代码的方法:

    Channel channel = session.openChannel("exec");
    ((ChannelExec)channel).setCommand(command);
    channel.setInputStream(null);
    

    ((ChannelExec)channel).setCommand(command);
    

    例外情况如下:

    java.lang.ClassCastException: com.jcraft.jsch.Channel$$EnhancerByMockitoWithCGLIB$$15aeab7e cannot be cast to com.jcraft.jsch.ChannelExec
    

    这是我的单元测试:

        @Test
    public void testExecuteSSHCommand() throws JSchException, IOException {
        Channel channel = mock(Channel.class);
        ChannelExec channelExec = mock(ChannelExec.class);
    
        String command = "dummyCommand";
        String result = "the correct result";
        InputStream inputStream = new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8));;
    
        when(channel.getInputStream()).thenReturn(inputStream);
        when(session.openChannel("exec")).thenReturn(channel);
        //when(channel.setCommand(command)).get();
    
        logger.info("Returning {}", sshClient.executeSSHCommand(session, command));
        assertEquals(result, sshClient.executeSSHCommand(session, command));
    }
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Peter Lawrey    7 年前

    如果希望openChannel返回ChannelExec

     Channel channel = session.openChannel("exec");
     ((ChannelExec)channel).setCommand(command);
    

    你需要说明

    when(session.openChannel("exec")).thenReturn(channelExec);
    
        2
  •  2
  •   Maaaatt    7 年前

    试一试

    when(session.openChannel("exec")).thenReturn(channelExec);
    

    存在差异,因为您当前正在返回抽象类的模拟,并尝试将其强制转换为其impl之一。