【问题标题】:How to mock typecast instances in Mockito如何在 Mockito 中模拟类型转换实例
【发布时间】:2021-01-14 07:38:10
【问题描述】:

我有一个 SFTP 文件的方法。在该方法中,我有以下 sn-p 代码:-

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

下面是一个sn-p的测试方法:

@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));

【问题讨论】:

  • 你在做什么应该可以,你能分享一下你用什么运行测试吗? (@RunWith ..)
  • 我有这个:@RunWith(MockitoJUnitRunner.class)

标签: java unit-testing junit mockito powermockito


【解决方案1】:

在使用 PowerMockito 时不能使用 @MockBean,因为最新版本需要 PowerMockRunner @RunWith(PowerMockRunner.class) 而 MockBean 需要 SpringRunner @RunWith(SpringRunner.class)

相反,使用 Mockito 的 @Mock 和 PowerMockRunner,也不要忘记准备测试具有您正在测试的方法的类。

当调用session.openChannel 时,用channelSftp 替换你的channel

@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));
    }
}

【讨论】:

    【解决方案2】:

    在您的代码“channelSftp = (ChannelSftp) channel;”中,“channelSftp”和“channel”是相同的引用。但是您的测试用例模拟了不同的对象。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多