Мне нужно высмеять экземпляр RestRequest
с Mockito
таким образом, чтобы этот метод возвращался, например, 10.0.0.1
.Можно ли издеваться над вложенным объектом, к которому обращается отражение?
private static String getAddress(RestChannel channel) {
String remoteHost = null;
try {
NettyHttpChannel obj = (NettyHttpChannel) channel;
Field f = obj.getClass().getDeclaredField("channel");
f.setAccessible(true);
SocketChannel sc = (SocketChannel) f.get(obj);
InetSocketAddress remoteHostAddr = sc.getRemoteAddress();
remoteHost = remoteHostAddr.getAddress().getHostAddress();
// Make sure we recognize localhost even when IPV6 is involved
if (localhostRe.matcher(remoteHost).find()) {
remoteHost = LOCALHOST;
}
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
return remoteHost;
}
Является ли это что-то возможно на всех? Мне нужно было бы высмеивать хотя бы до вызова SocketChannel.getRemoteAddress()
, где сокет-канал является частным полем, доступным при отражении.
есть несколько опечаток в вашем ответе, и 'NettyHttpChannel' конструктор изменился, но я в конечном итоге делает его работать ваш путь, потому что Mockito НЕ МОЖЕТ Мок' типы Field'. – sscarduzio
Рад, что ты заработал. –