Пересмешивающая локальная переменная с PowerMockito не работает - PullRequest
0 голосов
/ 26 февраля 2020

Я просмотрел документацию и примеры по PowerMockito и не могу заставить работать локальную переменную. Здесь включены урезанные версии тестируемого класса и контрольного примера.

public abstract class BaseClass {
    protected FTPClient initFtpClient(String server, int port, String user, String pwd, boolean useSecure) throws IOException {
        FTPClient ftps = useSecure ? new FTPSClient(true) : new FTPClient();
        ftps.setConnectTimeout(15000);
        ftps.setControlEncoding(StandardCharsets.UTF_8.name());
        ftps.connect(server, port);
        int reply = ftps.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            throw new RuntimeException("Server refused connection");
        }
        if (!ftps.login(user, pwd)) {
            throw new RuntimeException("Authentication error");
        }
        ftps.enterLocalPassiveMode();
        if (useSecure) {
            ((FTPSClient)ftps).execPROT("P");
        }
        ftps.setFileType(FTP.BINARY_FILE_TYPE);
        return ftps;
    }
}


public class ConcreteClass extends BaseClass {
}


@RunWith(PowerMockRunner.class)
class PowerMockitoUseApplicationTests {

    @Test
    @PrepareForTest(demo.ConcreteClass.class)
    void testInitFtpClient4SecureAndAllGood() {
        try {
            FTPSClient ftps = mock(FTPSClient.class);

            whenNew(FTPSClient.class).withAnyArguments().thenReturn(ftps);
            when(ftps.getReply()).thenReturn(200);


            ConcreteClass classUnderTest = new ConcreteClass();

            FTPSClient ftprtn = (FTPSClient) classUnderTest.initFtpClient("fakesite.com",22,"fakeuser", "fakepwd",true);

            ArgumentCaptor<String> acExecProtVal = ArgumentCaptor.forClass(String.class);
            verify(ftps).execPROT(acExecProtVal.capture());
            assertEquals("P", acExecProtVal.getValue());

        } catch (Exception e) {
            fail(e);
        }

    }
}

При запуске теста в первой строке метода initFtpClient создается стандартный экземпляр класса FTPSClient. Я ожидал, что будет использоваться макетированный экземпляр, созданный контрольным примером.

Кто-нибудь может увидеть то, что мне не хватает?

...