Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mock a sftp session

Tags:

java

junit

sftp

I am updating a few tests. The Before gets the sftp session. For this, the username and password have been hardcoded in the properties file. Due to security reasons, the password cannot be checked in and has to be blanked out. However the unit test fails at

private DefaultSftpSessionFactory sftpClientFactory;
private  SftpSession sftpSession;

 @Before
 public void setup() {
    sftpSession = sftpClientFactory.getSession();
    
}

This step fails with "either a password or private key is required".I would like to get a mock session, so that I dont have to provide a password.

like image 481
Mary Avatar asked Oct 21 '25 07:10

Mary


2 Answers

In case you are using JUnit 5 Jupiter (might be easily adaptable to JUnit 4 as well) I´ve written an article on how to do it using the atmoz/sftp Docker image together with Testcontainers.

The full working example can be found here

https://overflowed.dev/blog/sftp-testing-junit-testcontainers-atmoz-sftp/

This is basically how you would define your TestContainer with SFTP

 private static final GenericContainer sftp = new GenericContainer(
            new ImageFromDockerfile()
                    .withDockerfileFromBuilder(builder ->
                            builder
                                    .from("atmoz/sftp:latest")
                                    .run("mkdir -p /home/" + USER + "/upload; chmod -R 007 /home/" + USER)
                                    .build()))
            //.withFileSystemBind(sftpHomeDirectory.getAbsolutePath(), "/home/" + USER + REMOTE_PATH, BindMode.READ_WRITE) //uncomment to mount host directory - not required / recommended
            .withExposedPorts(PORT)
            .withCommand(USER + ":" + PASSWORD + ":1001:::upload");
like image 136
Marian Klühspies Avatar answered Oct 23 '25 19:10

Marian Klühspies


Regarding the unanswered/able question What's the best mock framework for Java?, a Mockito approach would be:

  1. Get the needed libraries into your (test) class path. (https://mvnrepository.com/artifact/org.mockito)

  2. Mock the SftpSession. (Via annotation private @Mock SftpSession sftpSession; ...plus the according initialization/enablement, or (manually) via sftpSession = Mockito.mock(SftpSession.class);)

    a. See, whether the SessionFactory is needed (for test) at all, if so also mock.

  3. Mock/verify/reset any interactions (within your tests) with the mocked objects. (Like Mockito.when(sftpSession.foo(x,y,z)).then... or Mockito.verify(sftpSession, Mockito.times(n)).foo(x,y,z);)

Further reading:

  • https://www.baeldung.com/mockito-series
  • https://stackoverflow.com/questions/tagged/mockito
like image 45
xerx593 Avatar answered Oct 23 '25 19:10

xerx593