如何在 Mockito 中模拟类型转换实例
How to mock typecast instances in Mockito
我有一个 SFTP 文件的方法。在该方法中,我有以下代码片段:-
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
JSch jsch = new JSch();
try (FileInputStream fileInputStream = new FileInputStream(new File(fileName));){
session = jsch.getSession(sftpUser, sftpHost, sftpPort);
session.setPassword(sftpPass);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
log.info("Host connected.");
channel = session.openChannel("sftp");
channel.connect();
log.info("sftp channel opened and connected.");
channelSftp = (ChannelSftp) channel;
channelSftp.cd(sftpWorkingFolder);
channelSftp.put(fileInputStream, new File(fileName).getName());
} catch (JSchException | SftpException | IOException e) {
log.error("Exception : ", e);
}
我正在为上面写Junit测试方法。如何模拟 channelSftp
的实例,它只是带有类型转换的 channel
?
下面是测试方法的片段:
@MockBean
private JSch jSch;
@Mock
FileInputStream fileInputStream;
@MockBean
private Session session;
@MockBean
private Channel channel;
@MockBean
private ChannelSftp channelSftp;
PowerMockito.whenNew(JSch.class).withNoArguments().thenReturn(jSch);
PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream);
when(jSch.getSession("ddmin", "localhost:8080", 22)).thenReturn(session);
doNothing().when(session).connect();
when(session.openChannel("sftp")).thenReturn(channel);
doNothing().when(channel).connect();
doNothing().when(channelSftp).cd(any(String.class));
您不能在使用 PowerMockito 时使用 @MockBean
,因为最新版本需要 PowerMockRunner @RunWith(PowerMockRunner.class)
而 MockBean 需要 SpringRunner @RunWith(SpringRunner.class)
相反,使用 Mockito 的 @Mock 和 PowerMockRunner,也不要忘记准备测试 class,其中包含您正在测试的方法。
并在调用 session.openChannel
时将 channel
替换为 channelSftp
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassThatHasMethodToBeTested.class)
public class JSchTest
{
@Mock
private JSch jSch;
@Mock
FileInputStream fileInputStream;
@Mock
private Session session;
@Mock
private Channel channel;
@Mock
private ChannelSftp channelSftp;
@Test
public void someTest() throws Exception
{
MockitoAnnotations.initMocks(this.getClass());
PowerMockito.whenNew(JSch.class)
.withNoArguments()
.thenReturn(jSch);
PowerMockito.whenNew(FileInputStream.class)
.withAnyArguments()
.thenReturn(fileInputStream);
when(jSch.getSession("ddmin", "localhost:8080", 22)).thenReturn(session);
doNothing().when(session)
.connect();
when(session.openChannel("sftp")).thenReturn(channelSftp); // channelSftp instead of channel
doNothing().when(channelSftp)
.connect();
doNothing().when(channelSftp)
.cd(any(String.class));
}
}
在你的代码“channelSftp = (ChannelSftp) channel;”中,“channelSftp”和“channel”是相同的reference.But你的测试用例模拟了不同的对象。
我有一个 SFTP 文件的方法。在该方法中,我有以下代码片段:-
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
JSch jsch = new JSch();
try (FileInputStream fileInputStream = new FileInputStream(new File(fileName));){
session = jsch.getSession(sftpUser, sftpHost, sftpPort);
session.setPassword(sftpPass);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
log.info("Host connected.");
channel = session.openChannel("sftp");
channel.connect();
log.info("sftp channel opened and connected.");
channelSftp = (ChannelSftp) channel;
channelSftp.cd(sftpWorkingFolder);
channelSftp.put(fileInputStream, new File(fileName).getName());
} catch (JSchException | SftpException | IOException e) {
log.error("Exception : ", e);
}
我正在为上面写Junit测试方法。如何模拟 channelSftp
的实例,它只是带有类型转换的 channel
?
下面是测试方法的片段:
@MockBean
private JSch jSch;
@Mock
FileInputStream fileInputStream;
@MockBean
private Session session;
@MockBean
private Channel channel;
@MockBean
private ChannelSftp channelSftp;
PowerMockito.whenNew(JSch.class).withNoArguments().thenReturn(jSch);
PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream);
when(jSch.getSession("ddmin", "localhost:8080", 22)).thenReturn(session);
doNothing().when(session).connect();
when(session.openChannel("sftp")).thenReturn(channel);
doNothing().when(channel).connect();
doNothing().when(channelSftp).cd(any(String.class));
您不能在使用 PowerMockito 时使用 @MockBean
,因为最新版本需要 PowerMockRunner @RunWith(PowerMockRunner.class)
而 MockBean 需要 SpringRunner @RunWith(SpringRunner.class)
相反,使用 Mockito 的 @Mock 和 PowerMockRunner,也不要忘记准备测试 class,其中包含您正在测试的方法。
并在调用 session.openChannel
时将 channel
替换为 channelSftp
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassThatHasMethodToBeTested.class)
public class JSchTest
{
@Mock
private JSch jSch;
@Mock
FileInputStream fileInputStream;
@Mock
private Session session;
@Mock
private Channel channel;
@Mock
private ChannelSftp channelSftp;
@Test
public void someTest() throws Exception
{
MockitoAnnotations.initMocks(this.getClass());
PowerMockito.whenNew(JSch.class)
.withNoArguments()
.thenReturn(jSch);
PowerMockito.whenNew(FileInputStream.class)
.withAnyArguments()
.thenReturn(fileInputStream);
when(jSch.getSession("ddmin", "localhost:8080", 22)).thenReturn(session);
doNothing().when(session)
.connect();
when(session.openChannel("sftp")).thenReturn(channelSftp); // channelSftp instead of channel
doNothing().when(channelSftp)
.connect();
doNothing().when(channelSftp)
.cd(any(String.class));
}
}
在你的代码“channelSftp = (ChannelSftp) channel;”中,“channelSftp”和“channel”是相同的reference.But你的测试用例模拟了不同的对象。