java - 班级演员表上的 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);
}
解决方案
麻烦的是,@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);
}
推荐阅读
- c# - 如何将带下划线的json键转换为C#中的新对象
- javascript - 将元素保存为常量时更改 HTML 元素的正确方法(未捕获的 TypeError:分配给常量变量)
- php - CodeIgniter4:使用 Ajax 重新提交表单给出 403 Forbidden
- python-3.x - Linkedin 网页抓取片段
- java - 如何在 Java 中读取文件
- documentation - Apple 何时弃用或停止发布使用命名分叉的 API,即数据和资源分叉以外的分叉?
- environment-variables - uname.c 中的 HOST_OPERATING_SYSTEM 来自哪里?
- java - “类加载器创建的对象的方法和构造函数可能引用其他类”是什么意思?
- sql - 需要列值分散在多个列中
- reactjs - nivo.rocks 绘制图表不正确,线条不对应 XY