Я просмотрел документацию и примеры по 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. Я ожидал, что будет использоваться макетированный экземпляр, созданный контрольным примером.
Кто-нибудь может увидеть то, что мне не хватает?