Java 如何使用Arquillian和Mock测试restapi
我想测试以下类实现JAX-RS,其中包含CDI注入Java 如何使用Arquillian和Mock测试restapi,java,rest,mockito,cdi,jboss-arquillian,Java,Rest,Mockito,Cdi,Jboss Arquillian,我想测试以下类实现JAX-RS,其中包含CDI注入 @Path("area") public class AreaService { @Inject @SuppressWarnings("unused") private Logger logger; @Context private SecurityContext context; @Inject private AreaGateway areaGateway; @GET
@Path("area")
public class AreaService {
@Inject
@SuppressWarnings("unused")
private Logger logger;
@Context
private SecurityContext context;
@Inject
private AreaGateway areaGateway;
@GET
@Path("{area-name}/team-project/{tp-id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getAreaByTeamProjectAndName(@PathParam("tp-id") long tpId, @PathParam("area-name") String areaName)
throws WebApplicationException {
Area area = areaGateway.getAreaByTeamProjectAndName(tpId, areaName);
return Response.status(Response.Status.OK).entity(area).build();
}
@POST
@Path("team-project/{tp-id}")
@Auditable
@Consumes(MediaType.APPLICATION_JSON)
public Response createArea(@PathParam("tp-id") long tpId, @Payload Area area) throws WebApplicationException {
long areaId = areaGateway.createArea(tpId, area, context);
return Response.status(Response.Status.CREATED).entity(areaId).build();
}
}
我选择了Arquillian作为测试框架,并将其用于RESTAPI
特别是,我曾尝试遵循Warp REST示例,但我找不到一个干净清晰的示例来测试我的REST API,该示例使用模拟注入依赖项(如AreaGateway)和任何模拟框架(如Mockito)
我想这样做:
@RunWith(Arquillian.class)
public class RestClientTestCase {
@ArquillianResource
public URL contextPath;
private AreaService areaService;
private AreaGateway areaGateway;
@Deployment(testable = false)
public static WebArchive create() {
WebArchive war = ShrinkWrap.create(WebArchive.class)
.addClasses(SLF4JProducer.class, AreaGateway.class, JAXRSActivator.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "WEB-INF/beans.xml");
MavenResolverSystem resolver = Maven.resolver();
war.addAsLibraries(resolver.loadPomFromFile("pom.xml").resolve("org.mockito:mockito-all:1.10.8").withTransitivity().asSingleFile());
return war;
}
@BeforeClass
public static void setUpClass() {
// initializes the rest easy client framework
RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
}
@Before
public void setUp() {
areaGateway = Mockito.mock(AreaGateway.class);//real bean replaced by mocked one
Mockito.when(areaGateway.getAreaByTeamProjectAndName(0, "areaName")).thenReturn(new Area());
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target("" + "rest");
areaService = target.proxy(AreaService.class);
}
@Test
@RunAsClient
public void testStockGetWarp() {
Response response = areaService.getAreaByTeamProject(0);
assertEquals("The service returned status code.", 201, response.getStatus());
response.close();
}
}
有人能帮我开发具有精确Maven依赖关系的最小测试样本吗?根据Arquillian的说法,是否可以用一些框架来模拟CDI依赖关系?我不确定模拟框架如何使用CDI,但如果您只是指示它使用
new Area()
而不是“CDI方式”(将对象创建留给CDI),那么CDI将根本无法处理此类对象的生命周期。它只是不知道您这样做了,区域
对象将不会解析任何依赖项。我建议您改为使用仅在测试环境中启用的替代方案/装饰器。在这里,您可以完全避免模拟并充分利用CDI。这不是一个完整的示例,但展示了一个CDI生成器,它使用Mockito生成模拟对象。我认为这可能是基于: