【发布时间】:2019-06-18 09:50:09
【问题描述】:
我有一些处理程序(在这个例子中我只使用控制器):
@RestController
public class MessageController {
private final TaskExecutor taskExecutor;
private final Operation operation;
private final MessageLogService messageLogService;
public MessageController(TaskExecutor taskExecutor, Operation operation, MessageLogService messageLogService) {
this.taskExecutor = taskExecutor;
this.operation = operation;
this.messageLogService = messageLogService;
}
@PostMapping(value = "/process")
public String handleMessage(MessageRequest messageRequest){
MessageLog messageLog = messageLogService.createNewMessageLog();
taskExecutor.execute(() -> {
try {
operation.process(messageLog.getGuid(), messageRequest);
} catch (MessageLogDoesNotExistException e) {
throw new RuntimeException(e);
}
});
return "REQUEST_QUOTED";
}
}
- 我收到了一些请求。
- 我在 DB 中创建了新的
MessageLog,状态为“NEW”和一些默认值(以及来自实际项目中请求的一些数据)值并保存。 - 我将
messageRequest和MessageLog's guid发送到执行器中的operation并立即返回同步响应“REQUEST_QUOTED”。
@Service
public class MessageOperation implements Operation {
private final MessageLogService messageLogService;
public MessageOperation(MessageLogService messageLogService) {
this.messageLogService = messageLogService;
}
@Transactional
@Override
public void process(String guid, MessageRequest messageRequest) throws MessageLogDoesNotExistException {
MessageLog messageLog = messageLogService.getOne(guid);
if (messageLog == null)
throw new MessageLogDoesNotExistException();
try {
Message message = createMessage(messageRequest);
messageLog.setStatus("SUCCESS");
messageLog.setMessage(message);
} catch (MessageCreationException e) {
messageLog.setStatus("FAIL");
messageLog.setErrorCode(e.getCode());
}
messageLogService.save(messageLog);
}
private Message createMessage(MessageRequest messageRequest) throws MessageCreationException {
//logic
return null;
}
}
进入operation 我创建消息并将其与messageLog 绑定。如果我创建并绑定成功 - 如果没有,我设置状态“成功”或“失败”。只需保存 messageLog。
如何为operation's 方法process 创建Unit test?无效。
1) 我收到客户的请求
2) 将请求委托给异步进程的新线程
3) 返回同步响应。
我不明白如何为public void process(String guid, MessageRequest messageRequest) 创建单元测试
【问题讨论】:
-
这更适合integration test,但如果您真的坚持对该方法进行单元测试,您也可以使用PowerMock 等库。
-
在单元测试中,您只需要断言您实际调用了您的测试服务使用的外部服务,例如您的方法 process() 调用 messageLogService,您需要断言该调用并模拟服务也是如此,您将在某个时间点调用流程,您将根据预期规则获得模拟响应
标签: java unit-testing spring-boot junit clean-architecture