【发布时间】:2020-01-29 07:53:50
【问题描述】:
我正在为我的项目使用 micronaut 框架。在对其中一种发布方法进行测试时,我返回 null,而不是响应正文。但是,当我直接在测试方法中调用控制器时,所有测试都可以正常工作。请分别查看我的控制器和测试代码。
Controller.Java
@Post(consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
public HttpResponse<ResultAttemptDTO> save(@Body Response response) {
User user = triviaService.checkUser(response.getUser());
int isCorrect = Utils.checkResponse(response);
/*Creates a new resultAttempt */
ResultAttempt resultAttempt = new ResultAttempt(
user.getId(),
LocalDateTime.now(),
response.getQuestion(),
response.getAnswer(),
Utils.generateAttemptId(),
isCorrect == 1 ? true: false);
ResultAttempt result = triviaResultService.postTriviaResults(resultAttempt);
gamificationClient.save(user.getId(), Utils.generateAttemptId(), isCorrect);
ResultAttemptDTO resultAttemptDTO = Utils.resultAttemptDTO(resultAttempt);
return HttpResponse.ok(resultAttemptDTO);
}
TestController.Java
@Test
void testPostResultAttempt() {
User user = new User();
user.setName("name");
user.setId(1l);
Response response1 = new Response();
response1.setAnswer("Trump");
response1.setQuestion("Who is the president of the USA");
response1.setChoices("Obama|Trump|Lincon");
response1.setCorrectAnswer(1);
response1.setUser(user);
ResultAttempt resultAttempt = new ResultAttempt();
resultAttempt.setAnswer("Trump");
resultAttempt.setQuestion("Who is the president of the USA");
resultAttempt.setLocalDateTime(LocalDateTime.now());
resultAttempt.setCorrect(true);
resultAttempt.setUserId(1l);
resultAttempt.setAttemptId(1);
resultAttempt.setId(1l);
Result result = new Result(1l, 1, 1);
ResultAttemptDTO resultAttemptDTO = new ResultAttemptDTO(resultAttempt.getUserId(),
Utils.dateFormat(LocalDateTime.now()), resultAttempt.getQuestion(), resultAttempt.getAnswer(),
String.valueOf(resultAttempt.isCorrect()));
when(triviaService.checkUser(user)).thenReturn(user);
when(triviaResultService.postTriviaResults(resultAttempt))
.thenReturn(resultAttempt);
when(gamificationClient.save(resultAttempt.getUserId(), resultAttempt.getAttemptId(), 1))
.thenReturn(result);
HttpResponse<ResultAttemptDTO> response = client.toBlocking().exchange(HttpRequest.POST("results", response1));
//HttpResponse<ResultAttemptDTO> response = trivialResultController.save(response1);
System.out.println(response.body());
assertEquals(response.body(), resultAttemptDTO);
assertEquals(response.status(), HttpStatus.OK);
}
代码
HttpResponse<ResultAttemptDTO> response = client.toBlocking().exchange(HttpRequest.POST("results", response1));
当我应该获取 ResultAttemptDTO 对象时返回 null。
一切正常
HttpResponse<ResultAttemptDTO> response = trivialResultController.save(response1);
关于它为什么不起作用的任何建议?
【问题讨论】:
-
你试过
HttpRequest.POST("/results", response1)吗? (注意"/results"中的前导斜杠) -
我无法重现您所看到的行为,但您的问题中缺少可能相关的部分。我创建了一个简单的示例,类似于您在github.com/jeffbrown/codymanresponse 所做的事情。控制器位于github.com/jeffbrown/codymanresponse/blob/master/src/main/java/…,测试位于github.com/jeffbrown/codymanresponse/blob/master/src/test/java/…。如果您可以改进它以模拟您看到的错误,那将很有帮助。
-
@JeffScottBrown 感谢您的回复。请在下面查看我的回复以获取正确的代码。
标签: micronaut