Java 如何使用Arquillian和Mock测试restapi

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

我想测试以下类实现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-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生成模拟对象。我认为这可能是基于: