gpt4 book ai didi

java - JMockit 和 Jersey JAX-RS 测试

转载 作者:太空宇宙 更新时间:2023-11-04 13:35:58 34 4
gpt4 key购买 nike

我有一个 Jersey REST Web 服务,我想构建一个单元测试,我按照 Jersey Test 文档提供的步骤进行操作,但在我的 Web 服务中,我引用了处理流程业务逻辑的其他类,我尝试使用 JMockit 来模拟该服务引用的业务服务类,但出现错误:

ProdService 是我的 RESTful JAX-RS Web 服务。ProdServiceBusinessRemote是我的业务服务接口(interface),它注入(inject)到ProdService中并进行业务逻辑处理。我想在 ProdServiceTest 中模拟 ProdServiceBusinessRemote:

public class ProdServiceTest extends JerseyTest {

@Injectable
private ProdServiceBusinessRemote prodServiceBusinessRemote;

@Before
public void setUp() throws Exception {
initMocks();
}

private void initMocks() throws Exception {
new NonStrictExpectations() {{
prodServiceBusinessRemote.query();
result = null;
}};

}

@Override
protected Application configure() {
return new ResourceConfig(ProdService.class);
}

@Test
public void test() throws Exception {
List list = target("prod").request().get(List.class);
org.junit.Assert.assertTrue(list == null);
}
}

如果我在没有 @RunWith(JMockit.class) 的情况下运行

java.lang.IllegalStateException: JMockit wasn't properly initialized; please ensure that jmockit precedes junit in the runtime classpath, or use @RunWith(JMockit.class)

如果我使用 @RunWith(JMockit.class) 运行,我会在 JerseyTest 内部函数中得到 NullPointerException:

public final WebTarget target() {
return client().target(getTestContainer().getBaseUri());
}

其中 client() 为 null;

有没有办法同时使用 Jmockit 和 JerseyTest ?对于引用外部类的服务,Jersey 有何建议?如何 mock 这些?

最佳答案

我找到的解决方案是进行以下更改:

  1. 确保 jmockit jar 在 pom.xml 中的 junit 之前加载:

        <!-- ************ TEST DEPENDENCIES ************ -->
    <dependency>
    <groupId>org.jmockit</groupId>
    <artifactId>jmockit</artifactId>
    <version>${jmockit.version}</version>
    <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
    </dependency>
  2. 不要使用 @RunWith(JMockit.class) 注释您的测试类,并确保您拥有 Jersey 测试的所有额外 Maven 依赖项:

        <!-- ************** Jersey Test ************************ -->
    <dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>${org.glassfish.jersey.core.version}</version>
    <scope>test</scope>
    </dependency>
  3. 您的测试类需要扩展 JerseyTest。因此避免使用@Before和@After注释。

  4. 要测试的示例类:

    @Path("/报价")

    public class OfferService extends BaseWebService {

    @EJB(mappedName = "myapp/OfferServiceBean")
    private OfferServiceBeanLocal offerServiceBean;
    public OfferServiceBeanLocal getServiceBean() {
    return offerServiceBean;
    }
    public void setOfferServiceBean(OfferServiceBeanLocal offerServiceBean) {
    this.offerServiceBean = offerServiceBean;
    }
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Path("/offers")
    public ListResponseDto<OfferDto> searchOffers(@Valid ListRequest v) {

    ListResponseDto<OfferDto> list = null;
    try {
    list = getServiceBean().getSellerOfferList(v);
    } catch(Exception e) {
    logException(e);
    }
    return list;
    }

    }

  5. OfferService 测试类:

    公共(public)类 OfferServiceTest 扩展 JerseyTest {

    @Mocked
    private HttpServletRequest request;

    @Mocked
    private HttpServletResponse response;

    @Override
    protected Application configure() {
    enable(TestProperties.LOG_TRAFFIC);
    enable(TestProperties.DUMP_ENTITY);

    OfferService service = new OfferService();

    // inject a Mocked EJB instance into your resource class
    service.setOfferServiceBean(new OfferServiceBeanMock());
    ResourceConfig config = new ResourceConfig();
    config.register(service);
    return config;
    }

    @Test
    public void test() throws Exception {
    // mocking static singleton example:
    new MockUp<ConfigurationManager>()
    {
    @Mock
    ConfigurationManager getInstance()
    {
    return MockWebTestUtil.buildConfigurationManagerMock();
    }
    };
    String expectedText = "{\"list\":[{\"id\":\"0\",\"name\":\"offer_0\"price\":0},{\"id\":\"1\",\"name\":\"offer_1\",\"price\":1}],\"summary\":{\"params\":null,\"page\":1,\"pageCount\":1,\"totalCount\":2},\"status\":{\"statusCode\":\"SUCCESS\",\"statusMessage\":null}}";

    ListRequest l = new ListRequest();
    l.setPage(1);
    l.setSearchColumns(new ArrayList<>());
    l.setRowsPerPage(10);

    Response output = target("/offer/offers").request(MediaType.APPLICATION_JSON).post(Entity.json(l));
    Assert.assertTrue(output.getStatus() == HttpStatus.OK_200);
    Assert.assertTrue(output.getHeaders().get("Content-Type").get(0).equals("application/json"));
    String textBody = output.readEntity(String.class);
    Assert.assertTrue(textBody.equals(expectedText));
    }

    }

    类 OfferServiceBeanMock 实现 OfferServiceBeanLocal {

    @Override
    public ListResponseDto<OfferDto> getSellerOfferList(ListRequest v) throws ServiceException {
    OfferListResponse resp = null;
    try {
    // build 2 sample offers
    resp = MockWebTestUtil.buildOfferListResponseDto(2);
    } catch (Exception e) {}
    return resp;
    }

    }

关于java - JMockit 和 Jersey JAX-RS 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31692568/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com