Suppose I have a service like this:

@Path("/")
public interface HeaderSetResource {
    @GET
    @Path("/hello")
    @Produces(TEXT_PLAIN)
    String sayHello(@HeaderParam("names") Set<String> names);
}


This test case fails:

@RunWith(MockitoJUnitRunner.class)
public class HeaderSetTest {

    @Mock
    private HeaderSetResource resourceMock;

    private Server server;
    private String address;


    private void callHello(Set<String> names) {
        final Invocation.Builder builder = webTarget().path("hello").request();
        names.forEach(name -> builder.header("names", name));
        builder.get();
    }

    public HeaderSetResource clientProxy() {
        final JAXRSClientFactoryBean factoryBean = new JAXRSClientFactoryBean();
        factoryBean.setFeatures(Collections.singletonList(new
LoggingFeature()));
        factoryBean.setResourceClass(HeaderSetResource.class);
        factoryBean.setAddress(address);
        return factoryBean.create(HeaderSetResource.class);
    }

    @Before
    public void createServer() {
        String port = "10090";
        address = String.format("http://localhost:%s/";, port);

        final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
        sf.setBus(BusFactory.getDefaultBus(true));
        sf.setResourceClasses(HeaderSetResource.class);
        sf.setFeatures(Collections.singletonList(new LoggingFeature()));
        sf.setResourceProvider(HeaderSetResource.class, new
SingletonResourceProvider(resourceMock, true));
        sf.setAddress(address);
        server = sf.create();
    }

    @Test
    public void multipleHeadersShouldWorkWithProxy() {
        final Set<String> names = new HashSet<>(Arrays.asList("foo",
"bar", "baz"));
        clientProxy().sayHello(names);
        verify(resourceMock).sayHello(names);
    }

    @Test
    public void multipleHeadersShouldWorkWithWebTarget() {
        final Set<String> names = new HashSet<>(Arrays.asList("foo",
"bar", "baz"));
        callHello(names);
        verify(resourceMock).sayHello(names);
    }

    @Test
    public void singleHeadersShouldWorkWithProxy() {
        final Set<String> names = Collections.singleton("foo");
        clientProxy().sayHello(names);
        verify(resourceMock).sayHello(names);
    }

    @Test
    public void singleHeadersShouldWorkWithWebTarget() {
        final Set<String> names = Collections.singleton("foo");
        callHello(names);
        verify(resourceMock).sayHello(names);
    }

    @After
    public void stopServer() {
        server.stop();
        server.destroy();
    }

    public WebTarget webTarget() {
        final ClientBuilder builder = ClientBuilder.newBuilder();
        builder.register(new LoggingFeature());
        return builder.build()
                .property(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE)
                .target(address);
    }
}

Reply via email to