【问题标题】:Mock objects not working with CXF WebClient.create().post()模拟对象不适用于 CXF WebClient.create().post()
【发布时间】:2017-04-22 00:14:55
【问题描述】:

我正在尝试为 Web 服务调用编写单元测试。使用 Mockito 模拟 DAO 层。我面临的问题是,当调用 WebClient 的 post() 时,模拟对象变为空。请求在不同的上下文中加载。以下是代码sn-p:

    @Before
    public void doSetup() {
    JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
    sf.setResourceClasses(UserService.class);
    List<Object> providers = new ArrayList<Object>();
    providers.add(new JacksonJsonProvider());
    sf.setProviders(providers);
    sf.setResourceProvider(UserService.class, 
            new SingletonResourceProvider(new UserService(),true));
    sf.setAddress(ENDPOINT_ADDRESS);
    Server server = sf.create();

    mockDelegator = Mockito.mock(UserDelegator.class);
    mockUserDao = Mockito.mock(UserDAO.class);
    mockDelegator.setUserDao(userDao);
    userService.setUserDelegator(mockDelegator);
    }

    @Test    
    public void fetchPersonalInformationTest() {
    WebClient client = WebClient.create(ENDPOINT_ADDRESS);
    WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
    client.path("users/fetchPersonalInfo");
    client.accept("application/json");
    client.type("application/json");
    Response response = client.post("{\"userName\":\"vijay@1357\"}"); //This call's UserService and thows NullPointerException for userDao and mockDelegator
    }

下面的sn-p来自UserService类:

@POST
@Path("/fetchPersonalInfo")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response fetchPersonalInformation(User user) {
    logger.error("Logger Running");
    String fetchJsonPersonalInfo=null;
    System.out.println(user.getUserName());
    try {
        BasicUtils.isNull(user.getUserName());
        BasicUtils.isNull(userDelegator);
        fetchJsonPersonalInfo = userDelegator.fetchPersonalInformation(user);
    } catch (ApplicationException e) {
        e.printStackTrace();

    }
    return Response.status(200).entity(fetchJsonPersonalInfo).build();
}

UserDelegator 类

public String fetchPersonalInformation(User user) {
    BasicUtils.isNull(userDao);
    return userDao.fetchPersonalInformation(user);
}

UserDAO 类

public String fetchPersonalInformation(User user) {
    logger.info("Started Execution at " + System.currentTimeMillis());
    String json=null;
    try {
        Statement query = QueryBuilder.select().json().from("members_data", "users").where(QueryBuilder.eq("username",user.getUserName()));
        ResultSet resultset = executeStatementOrQuery(query);
        Row row = resultset.one();
        json = row.getString("[json]");
    }
    catch(Exception e) {
        e.printStackTrace();
        throw new ApplicationException(Constants.ERROR_CODE_101, errMsg101, e);
    }
    logger.info("Finished Execution at " + System.currentTimeMillis());
    return json;
}

【问题讨论】:

  • 调用mockDelegator.setUserDao(userDao); 不会做任何事情,因为mockDelegator 是一个模拟。你可以试试return(userDao).when(mockDelegator).getUserDao();。但是你没有展示足够多的代码让我确定它对你有用。
  • 我刚刚添加了几乎完整的代码。 UserDelegator 没有 getUserDao() 但在调试时我可以看到 client.post() 调用 mockDelegator 也是 null
  • when(WebClient.create(ENDPOINT_ADDRESS)).thenReturn(mockWebClient);when(mockWebClient.post(any(String.class)).thenReturn("Some string"); 这应该可以帮助您入门。如果您不想模拟它,也可以返回一个实际的 WebClient 对象。小心嘲笑,因为当您嘲笑时,您失去了测试该部分的能力。
  • 嗯,在我之前的评论中,我显然是指doReturn,而不是return。那里打字有点太快了。
  • 这里仍然没有足够的代码来弄清楚发生了什么。您可能应该向我们展示您实际测试的类,而不仅仅是测试类。否则,我们都只是猜测。我要参加 VTC,因为它还不是 MVCE。

标签: java rest mockito cxf


【解决方案1】:

发现问题。问题在于为JAXRSServerFactoryBean 设置资源类。更改了以下代码:

@Before
public void doSetup() {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(UserService.class);

改成

@Before
public void doSetup() {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setServiceBean(userService);

如果您不想让 JAX-RS 运行时为您处理资源类生命周期(例如,您的资源类可能是由其他容器(例如 Spring)创建的)

参考文档CXF JAX-RS Service Configuration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多