Jak rozumiem, głównym celem autora tego wydania jest oddzielenie warstwy JAX RS od biznesowej. Test jednostkowy tylko pierwszy. Tutaj musimy rozwiązać dwa podstawowe problemy:
- Uruchom w teście jakiś serwer WWW / aplikacyjny, umieść w nim komponenty JAX RS. I tylko oni.
- Mock usługi biznesowe wewnątrz komponentów JAX RS / warstwy REST.
Pierwszą rozwiązuje Arquillian. Drugi jest doskonale opisany w arquillican i mock
Oto przykład kodu, może się różnić, jeśli używasz innego serwera aplikacji, ale mam nadzieję, że uzyskasz podstawowy pomysł i zalety.
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import com.brandmaker.skinning.service.SomeBean;
@Path("/entities")
public class RestBean
{
@Inject
SomeBean bean;
@GET
public String getEntiry()
{
return bean.methodToBeMoked();
}
}
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import com.google.common.collect.Sets;
@ApplicationPath("res")
public class JAXRSConfiguration extends Application
{
@Override
public Set<Class<?>> getClasses()
{
return Sets.newHashSet(RestBean.class);
}
}
public class SomeBean
{
public String methodToBeMoked()
{
return "Original";
}
}
import javax.enterprise.inject.Specializes;
import com.brandmaker.skinning.service.SomeBean;
@Specializes
public class SomeBeanMock extends SomeBean
{
@Override
public String methodToBeMoked()
{
return "Mocked";
}
}
@RunWith(Arquillian.class)
public class RestBeanTest
{
@Deployment
public static WebArchive createDeployment() {
WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
.addClasses(JAXRSConfiguration.class, RestBean.class, SomeBean.class, SomeBeanMock.class)
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
System.out.println(war.toString(true));
return war;
}
@Test
public void should_create_greeting() {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://127.0.0.1:8181/test/res/entities");
Invocation invocation = target.request().buildGet();
Response response = invocation.invoke();
Assert.assertEquals("Mocked", response.readEntity(String.class));
}
}
Kilka uwag:
- Używana jest tutaj konfiguracja JAX RS bez web.xml.
- Używany jest tutaj klient JAX RS (bez RESTEasy / Jersey, udostępniają wygodniejsze API)
- Kiedy zaczyna się test, biegacz Arquilliana zaczyna działać. Tutaj możesz dowiedzieć się, jak skonfigurować testy dla Arquilliana z wymaganym serwerem aplikacji.
- W zależności od wybranego serwera aplikacji adres URL w teście będzie się nieco różnić. Można użyć innego portu. W moim przykładzie 8181 jest używany przez Glassfish Embedded.
Mam nadzieję, że to pomoże.