by Guest » 07 Feb 2025, 02:50
Ich versuche, einen Spring -Boot -Controller zu testen, der Controller hat eine UserService Abhängigkeit und der UserService hat eine UserMapper Abhängigkeit, der Code kompilt und läuft makellose, aber beim Versuch, es zu versuchen Führen Sie den folgenden Test aus. Ich erhalte einen Fehler: < /p>
Code: Select all
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userControllerImpl':
Unsatisfied dependency expressed through field 'userMapper': Error creating bean with name 'com.acneUserMapper':
Failed to instantiate [com.acne.user.UserMapper]: Specified class is an interface
< /code>
Test: < /p>
@WebMvcTest(UserController.class)
@Import(UserMapper.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@AutoConfigureWebMvc
public class UserControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldGetAuthenticatedUser() throws Exception {
this.mockMvc.perform(get("/api/users/me").with(oidcLogin())).andExpect(status().isOk());
}
}
< /code>
UsMapper: < /p>
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface UserMapper {
public UserResponseDTO toUserResponseDTO(UserEntity userEntity);
public UserDTO toDto(UserEntity entity);
public UserEntity toEntity(UserDTO dto);
}
< /code>
UserController & Impl: < /p>
public interface UserController {
@GetMapping("/me")
public ResponseEntity getCurrentUser(Authentication authentication);
}
< /code>
@RestController
public class UserControllerImpl implements UserController {
@Autowired
UserMapper userMapper;
@Autowired
UserService userService;
@Override
public ResponseEntity getCurrentUser(Authentication currentUser) {
UserEntity loggedUser = userService.findByLoginOrError(currentUser.getName());
return ResponseEntity.ok(userMapper.toUserResponseDTO(loggedUser));
}
}
Wenn ich den Test-Import in @Import (UsMapperImpl.class) ändere Der Fehler ändert sich zu:
Code: Select all
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.acne.user.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency a
nnotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Meine Frage lautet: Was kann ich tun, um den Controller zu testen und den Mapper korrekt injizieren?
Ich versuche, einen Spring -Boot -Controller zu testen, der Controller hat eine UserService Abhängigkeit und der UserService hat eine UserMapper Abhängigkeit, der Code kompilt und läuft makellose, aber beim Versuch, es zu versuchen Führen Sie den folgenden Test aus. Ich erhalte einen Fehler: < /p>
[code]Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userControllerImpl':
Unsatisfied dependency expressed through field 'userMapper': Error creating bean with name 'com.acneUserMapper':
Failed to instantiate [com.acne.user.UserMapper]: Specified class is an interface
< /code>
Test: < /p>
@WebMvcTest(UserController.class)
@Import(UserMapper.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@AutoConfigureWebMvc
public class UserControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldGetAuthenticatedUser() throws Exception {
this.mockMvc.perform(get("/api/users/me").with(oidcLogin())).andExpect(status().isOk());
}
}
< /code>
UsMapper: < /p>
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface UserMapper {
public UserResponseDTO toUserResponseDTO(UserEntity userEntity);
public UserDTO toDto(UserEntity entity);
public UserEntity toEntity(UserDTO dto);
}
< /code>
UserController & Impl: < /p>
public interface UserController {
@GetMapping("/me")
public ResponseEntity getCurrentUser(Authentication authentication);
}
< /code>
@RestController
public class UserControllerImpl implements UserController {
@Autowired
UserMapper userMapper;
@Autowired
UserService userService;
@Override
public ResponseEntity getCurrentUser(Authentication currentUser) {
UserEntity loggedUser = userService.findByLoginOrError(currentUser.getName());
return ResponseEntity.ok(userMapper.toUserResponseDTO(loggedUser));
}
}
[/code]
Wenn ich den Test-Import in @Import (UsMapperImpl.class) ändere Der Fehler ändert sich zu:
[code]Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.acne.user.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency a
nnotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
[/code]
Meine Frage lautet: Was kann ich tun, um den Controller zu testen und den Mapper korrekt injizieren?