【发布时间】: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。