Test service that uses eureka and ribbon
The following code (taken from https://github.com/Netflix/eureka/blob/a7a8d278e6399bbff5faa49b9fcbcd7ea9e854f4/eureka-core/src/test/java/com/netflix/eureka/mock/MockRemoteEurekaServer.java) may be helpful to you;
public class MockRemoteEurekaServer extends ExternalResource {public static final String EUREKA_API_BASE_PATH = "/eureka/v2/";private final Map<String, Application> applicationMap;private final Map<String, Application> applicationDeltaMap;private final Server server;private boolean sentDelta;private int port;private volatile boolean simulateNotReady;public MockRemoteEurekaServer(int port, Map<String, Application> applicationMap, Map<String, Application> applicationDeltaMap) { this.applicationMap = applicationMap; this.applicationDeltaMap = applicationDeltaMap; ServletHandler handler = new AppsResourceHandler(); EurekaServerConfig serverConfig = new DefaultEurekaServerConfig(); EurekaServerContext serverContext = mock(EurekaServerContext.class); when(serverContext.getServerConfig()).thenReturn(serverConfig); handler.addFilterWithMapping(ServerRequestAuthFilter.class, "/*", 1).setFilter(new ServerRequestAuthFilter(serverContext)); handler.addFilterWithMapping(RateLimitingFilter.class, "/*", 1).setFilter(new RateLimitingFilter(serverContext)); server = new Server(port); server.addHandler(handler); System.out.println(String.format( "Created eureka server mock with applications map %s and applications delta map %s", stringifyAppMap(applicationMap), stringifyAppMap(applicationDeltaMap)));}@Overrideprotected void before() throws Throwable { start();}@Overrideprotected void after() { try { stop(); } catch (Exception e) { Assert.fail(e.getMessage()); }}public void start() throws Exception { server.start(); port = server.getConnectors()[0].getLocalPort();}public void stop() throws Exception { server.stop();}public boolean isSentDelta() { return sentDelta;}public int getPort() { return port;}public void simulateNotReady(boolean simulateNotReady) { this.simulateNotReady = simulateNotReady;}private static String stringifyAppMap(Map<String, Application> applicationMap) { StringBuilder builder = new StringBuilder(); for (Map.Entry<String, Application> entry : applicationMap.entrySet()) { String entryAsString = String.format("{ name : %s , instance count: %d }", entry.getKey(), entry.getValue().getInstances().size()); builder.append(entryAsString); } return builder.toString();}private class AppsResourceHandler extends ServletHandler { @Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { if (simulateNotReady) { response.setStatus(HttpServletResponse.SC_FORBIDDEN); return; } String authName = request.getHeader(AbstractEurekaIdentity.AUTH_NAME_HEADER_KEY); String authVersion = request.getHeader(AbstractEurekaIdentity.AUTH_VERSION_HEADER_KEY); String authId = request.getHeader(AbstractEurekaIdentity.AUTH_ID_HEADER_KEY); Assert.assertNotNull(authName); Assert.assertNotNull(authVersion); Assert.assertNotNull(authId); Assert.assertTrue(!authName.equals(ServerRequestAuthFilter.UNKNOWN)); Assert.assertTrue(!authVersion.equals(ServerRequestAuthFilter.UNKNOWN)); Assert.assertTrue(!authId.equals(ServerRequestAuthFilter.UNKNOWN)); for (FilterHolder filterHolder : this.getFilters()) { filterHolder.getFilter().doFilter(request, response, new FilterChain() { @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { // do nothing; } }); } String pathInfo = request.getPathInfo(); System.out.println( "Eureka resource mock, received request on path: " + pathInfo + ". HTTP method: |" + request .getMethod() + '|'); boolean handled = false; if (null != pathInfo && pathInfo.startsWith("")) { pathInfo = pathInfo.substring(EUREKA_API_BASE_PATH.length()); if (pathInfo.startsWith("apps/delta")) { Applications apps = new Applications(); for (Application application : applicationDeltaMap.values()) { apps.addApplication(application); } apps.setAppsHashCode(apps.getReconcileHashCode()); sendOkResponseWithContent((Request) request, response, toJson(apps)); handled = true; sentDelta = true; } else if (pathInfo.startsWith("apps")) { Applications apps = new Applications(); for (Application application : applicationMap.values()) { apps.addApplication(application); } apps.setAppsHashCode(apps.getReconcileHashCode()); sendOkResponseWithContent((Request) request, response, toJson(apps)); handled = true; } } if (!handled) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "Request path: " + pathInfo + " not supported by eureka resource mock."); } } private void sendOkResponseWithContent(Request request, HttpServletResponse response, String content) throws IOException { response.setContentType("application/json; charset=UTF-8"); response.setStatus(HttpServletResponse.SC_OK); response.getOutputStream().write(content.getBytes("UTF-8")); response.getOutputStream().flush(); request.setHandled(true); System.out.println("Eureka resource mock, sent response for request path: " + request.getPathInfo() + " with content" + content); }}private String toJson(Applications apps) throws IOException { return new EurekaJsonJacksonCodec().getObjectMapper(Applications.class).writeValueAsString(apps);}}
One option would be to use Camel to mock/replace the Eureka endpoints. There should be config telling your app where to look for Eureka, so override that in your test configuration to point to new endpoint.
Then create a Camel route in test/src using either jetty or http to represent this new endpoint, which would return a response that the LoadBalancerClient expects. That response would have the URI under test (i.e. your application).