英文:
Spring WebTestClient response object is different from expected
问题
以下是您要翻译的内容:
I have a controller unit test using WebTestClient and it's failing on the isEqualTo()
test. I can't find what's wrong as I'm using the same object to set what the service call will return and the parameter for isEqualTo()
当我运行测试时,我得到了类似以下的结果:
Expected :com.model.Response@ab41b46
Actual :com.model.Response@c1dcdb9
模型:这只是其中一部分,但其他对象只是字符串。
public class Response implements Serializable {
private static final long serialVersionUID = 1L; // 随机长整数
private String id;
private Long amount;
private LocalDateTime dateTime;
private String status;
// setter 和 getter 方法
}
控制器:
@PostMapping
public Mono<Response> getResponse() {
return myService.getResponse();
}
测试:
@ExtendWith(MockitoExtension.class)
@WebFluxTest(controllers = MyController.class)
public class MyControllerTest
{
@Autowired
private transient WebTestClient webTestClient;
@MockBean
private transient MyService myService;
@Test
void shouldReturnResponse() {
var response = new Response();
response.id("id");
response.setAmount(10L);
when(myService.getResponse()).thenReturn(Mono.just(response));
webTestClient.post()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(Response.class)
.isEqualTo(response);
}
}
正如您所见,我对myService进行了存根化,使其返回response
的Mono,并期望isEqualTo()
上相同的结果。
我有一些类似的测试,它们正常工作。我目前正在检查是否与Response
对象有关。
英文:
I have a controller unit test using WebTestClient and it's failing on the isEqualTo()
test. I can't find what's wrong as I'm using the same object to set what the service call will return and the parameter for isEqualTo()
When I run the test I'm getting something like
Expected :com.model.Response@ab41b46
Actual :com.model.Response@c1dcdb9
Model: This is just a portion of it but the other objects are just Strings
public class Response implements Serializable {
private static final long serialVersionUID = 1L; //random long
private String id;
private Long amount;
private LocalDateTime dateTime;
private String status;
//setters-getters
}
Controller:
@PostMapping
public Mono<Response> getResponse() {
return myService.getResponse();
}
Test:
@ExtendWith(MockitoExtension.class)
@WebFluxTest(controllers = MyController.class)
public class MyControllerTest
{
@Autowired
private transient WebTestClient webTestClient;
@MockBean
private transient MyService myService;
@Test
void shouldReturnResponse() {
var response = new Response();
response.id("id");
response.setAmount(10L);
when(myService.getResponse()).thenReturn(Mono.just(response));
webTestClient.post()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(Response.class)
.isEqualTo(response);
}
}
As you can see I stubbed myService to return a Mono of response
and just expected the same on isEqualTo()
I have some similar tests to this and they're working fine. I'm currently checking if this is an issue with the Response
object
答案1
得分: 1
isEqualTo
使用equals
方法来验证对象是否相等。
从你在这里发布的内容来看,你没有实现equals
方法。没有equals
方法意味着它将使用默认的方法,基本上是检查它是否是相同的对象实例。显然这不是真的。
因此,要么实现一个合适的equals
方法,要么使用不同的方式来断言你的结果。
@Test
void shouldReturnResponse() {
var response = new Response();
response.id("id");
response.setAmount(10L);
when(myService.getResponse()).thenReturn(Mono.just(response));
webTestClient.post()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(Response.class)
.consumeWith((response) -> assertThat(response.getId()).isEqualTo("id"));
}
上面的代码片段使用AssertJ来进行断言(当然你也可以扩展这些断言)。要进行其他验证,BodySpec
上还有其他方法,选择适合你需求的方法。
英文:
isEqualTo
uses the equals
method to verify if objects are equal.
Judging from what you have posted here you haven't implemented the equals
method. No equals
method means it will use the default which is basically checking if it is the same object instance. Which obviously isn't true.
Hence either implement a proper equals
method or use a different way of asserting your result.
@Test
void shouldReturnResponse() {
var response = new Response();
response.id("id");
response.setAmount(10L);
when(myService.getResponse()).thenReturn(Mono.just(response));
webTestClient.post()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(Response.class)
.consumeWith( (response) -> assertThat(response.getId()).isEqualTo("id"));}
The snippet above uses AssertJ to do the assert (ofcourse you can extend those as well). To do other validations there are other methods on the BodySpec
as well, pick the one that suits your needs.
答案2
得分: 0
你正在创建一个包含响应对象的单一对象。然后,你从你的 WebTestClient 中获取它。你的 isEqualTo 比较了这两个对象,它们并不完全相同,因为 mono -> object。我建议比较对象内部的值。
Mono<Response> clientResponse = webTestClient.post()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(Response.class);
assertThat(clientResponse.block().getId()).isEqualTo("id");
assertThat(clientResponse.block().getResponse().getAmount()).isEqualTo(10L);
英文:
You're creating a mono object with the response object in it. Then you fetch it from your WebTestClient. You're isEqualTo compares the two Objects, which aren't exactly the same object -> mono -> object. I would suggest to compare the values inside the objects.
Mono<Response> clientResponse = webTestClient.post()
.uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(Response.class);
assertThat(clientResponse.block().getId()).isEqualTo("id");
assertThat(clientResponse.block().response.getAmount()).isEqualTo(10L);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论