我正在尝试使用MockMvc和mockito为应用程序中的rest控制器类编写单元测试。我有一个实体类的DTO类,我给出它作为controller方法的输入。controller方法将此DTO对象映射到entity类中,并使用my service类持久化它。持久化之后,通过映射service类的方法返回的对象来创建一个新的DTO类,并在ResponseEntity对象中返回这个DTO。在我的单元测试中,我已经使用@MockBean注释模拟了service类和ModelMapper类。我还在为模拟类的方法设置预期的返回值。但是当我运行测试时,我看到响应体是空的,我假设这是因为模拟映射器没有正确返回DTO对象。有人能帮我让模拟映射器正确地返回对象,这样我的测试就通过了吗?多谢了。
@RequestMapping(value = "", method=RequestMethod.POST)
public ResponseEntity<BranchDto> addBranch(@RequestBody BranchDto branchDto) {
Branch branch = modelMapper.map(branchDto, Branch.class);
Branch addedBranch = branchService.addBranch(branch);
return new ResponseEntity<>(modelMapper.map(addedBranch, BranchDto.class), HttpStatus.CREATED);
}
下面是单元测试代码:
@Autowired
private MockMvc mockMvc;
@MockBean
private BranchService branchService;
@MockBean
private ModelMapper mockModelMapper;
@Test
public void testAddBranch() throws Exception{
BranchDto mockBranchDtoToAdd = new BranchDto();
mockBranchDtoToAdd.setBranchName("TestBranch");
mockBranchDtoToAdd.setContactNumber("12345");
mockBranchDtoToAdd.setEmailId("test@abc.com");
mockBranchDtoToAdd.setCity("TestCity");
Branch mockBranchToAdd = new Branch();
mockBranchToAdd.setBranchName("TestBranch");
mockBranchToAdd.setContactNumber("12345");
mockBranchToAdd.setEmailId("test@abc.com");
mockBranchToAdd.setCity("TestCity");
Branch mockAddedBranch = new Branch();
mockAddedBranch.setBranchName("TestBranch");
BranchDto mockAddedBranchDto = new BranchDto();
mockAddedBranchDto.setBranchName("TestBranch");
mockAddedBranchDto.setContactNumber("12345");
mockAddedBranchDto.setEmailId("test@abc.com");
mockAddedBranchDto.setCity("TestCity");
Mockito.when(mockModelMapper.map(mockBranchDtoToAdd, Branch.class)).thenReturn(mockBranchToAdd);
Mockito.when(branchService.addBranch(mockBranchToAdd)).thenReturn(mockAddedBranch);
Mockito.when(mockModelMapper.map(mockAddedBranch, BranchDto.class)).thenReturn(mockAddedBranchDto);
ObjectMapper mapper = new ObjectMapper();
String mockBranchDtoToAddStr = mapper.writeValueAsString(mockBranchDtoToAdd);
System.out.println(mockBranchDtoToAddStr);
mockMvc.perform(post("/branches").contentType(MediaType.APPLICATION_JSON).content(mockBranchDtoToAddStr))
.andExpect(MockMvcResultMatchers.status().isCreated())
.andExpect(MockMvcResultMatchers.jsonPath("$.branchName").value("TestBranch"));
}
经过大量的挖掘,我认为这条线
Mockito.when(branchService.addBranch(mockBranchToAdd)).thenReturn(mockAddedBranch);
没有正确设置模拟对象。我将这一行更改为在when()
方法中使用any()
,然后它工作得很好。以下是更新的代码:
Mockito.when(branchService.addBranch(org.mockito.ArgumentMatchers.any())).thenReturn(mockAddedBranch);
Mockito.when(mockModelMapper.map(org.mockito.ArgumentMatchers.any(), org.mockito.ArgumentMatchers.any())).thenReturn(mockAddedBranch);
使用MapStruct,我创建了一个映射器,它是一个抽象类。我决定将映射器从接口转换为抽象,以便使用组件名称,该组件本身使用名为的组件。 尽管映射工作正常,但在单元测试中,它会抱怨组件找不到合格bean。 映射器类。我尝试在注释的属性中添加。但是异常移到了的下一个组件。 出现异常的测试类。正如我提到的,我尝试将添加到。我还尝试通过添加来完全模仿它。
遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte
我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient
我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!
使用@SpringBootTest,据我所知,Spring实际上是在启动应用程序,并且应该创建映射器类,所以我不明白,为什么映射器总是空?!当我删除@SpringBootTest中的DummyMapper.class时,会出现一个错误,上面写着“Failed to load application Context”。这向我表明,映射器是被识别的。 我觉得奇怪的另一件事是,我必须在映射器中使用“un
我还尝试将模拟转换为文档,如下所示 但这会在代码实现内部访问MongoCollection时产生NullpointerException异常。 这两个我都试过了 null 我厌倦了用java编写相同的测试,并在其中进行泛型的转换。 有人在Kotlin有嘲弄泛型类的经验吗?