我试图为Spring Boot API编写JUnit 5测试,但在Test类中遇到依赖注入问题。我希望在ProfileController中测试端点,它有3个依赖项:ProfileService、ProfileModelAssembler(向json响应添加以REST为中心的装饰,例如"links")和ModelMapper。在我的Test类中,我有以下3个注解,如图所示:
@InjectMocks
ProfileController profileController;
@Mock
ProfileService profileService;
@Mock
ProfileModelAssembler profileModelAssembler;
@Mock
ModelMapper modelMapper;
当我尝试运行一个测试时,由于ProfileService的依赖性不满足("No qualifying bean of type x.ProfileService available"),它在示例化ProfileController时出错。
在我的ProfileController中,我尝试直接@Autowire这些字段(不推荐,我知道):
@Autowired
private ProfileService profileService;
@Autowired
private ProfileModelAssembler profileModelAssembler;
@Autowired
private ModelMapper modelMapper;
以及通过构造函数注入:
@Autowired
public ProfileController(ProfileService profileService, ProfileModelAssembler profileModelAssembler, ModelMapper modelMapper) {
this.profileService = profileService;
this.profileModelAssembler = profileModelAssembler;
this.modelMapper = modelMapper;
}
无论哪种方式,错误都是一样的。我发现JUnit和Mockito的教程在方法上完全不同,它们做的事情完全不同。我知道一个问题总是有多种解决方案,但我惊讶地发现,几乎没有人坚持任何一种“首选”的做法。有什么建议可以消除这个错误,或者有什么资源可以让我以一种“简单”的方式学习JUnit/Mockito,以满足我相对简单的需求?
1条答案
按热度按时间bq3bfh9z1#
@Mock
和@InjectMocks
注解与Spring无关,因此如何在ProfileController
类中自动连接依赖关系并不重要。从您得到的错误来看,您似乎正在运行@SpringBootTest
的测试,其中应用程序上下文启动,因此您需要在ProfileService
和其他注解上使用@MockBean
注解,以便将它们注入到应用程序上下文中。或者,您可以在不启动整个应用程序上下文的情况下进行基本的单元测试,其中
@Mock
和@InjectMocks
注解将按预期工作。只要确保正确初始化模拟即可。最简单的方法是用@ExtendWith(MockitoExtension.class)
注解测试类