首页 > 解决方案 > 班级演员表上的 Mockito 异常

问题描述

我在下面的方法中模拟了 Jsch() 类并获取了类强制转换异常。

原始方法。

JSch jsch = getSftpJsch();
session = jsch.getSession(sessionObj);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
LOGGER.info("sfg channel opened and connected.");
channelSftp = (ChannelSftp) channel;
channelSftp.cd(inboundPath);
Vector<ChannelSftp.LsEntry> list = channelSftp.ls(filePattern);

在线获取 Mockito 异常。

channelSftp = (ChannelSftp) channel;

例外:

java.lang.ClassCastException:com.jcraft.jsch.Channel$MockitoMock$1983492043 无法转换为 com.jcraft.jsch.ChannelSftp

测试用例调用方法。

@Mock(answer = Answers.RETURNS_MOCKS)
private JSch mockJsch;

private AppUtils sftp = new AppUtils(){
    @Override
    JSch getSftpJsch() {
        return mockJsch;
    }
};

@Test
public void tetsGetFileList(){
    sftp.getFileList(folderPath, fileName, charEncoding);
}

标签: javaunit-testingjunitmockito

解决方案


麻烦的是,@Mock(answer = Answers.RETURNS_MOCKS)它负责为每个调用创建一个模拟。包括channel = session.openChannel("sftp");.

所以channel现在包含一些Channel基类的模拟子类型。这就是演员阵容失败的原因。

因此,模拟它的稍微长一点的方法是:

@Mock
private JSch mockJsch;

@Mock
private Session session;

@Mock
private ChannelSftp channel;

@Before
public void setUp() {
    Mockito.when(mockJsch.getSession(Mockito.any())).thenReturn(session);
    Mockito.when(session.openChannel(Mockito.any())).thenReturn(channel);
}

private AppUtils sftp = new AppUtils(){
    @Override
    JSch getSftpJsch() {
        return mockJsch;
    }
};

@Test
public void tetsGetFileList(){
    sftp.getFileList(folderPath, fileName, charEncoding);
}

推荐阅读