java Sping Boot / JUnit 5 / Mockito -测试类中的mocking依赖

qni6mghb  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(126)

我试图为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,以满足我相对简单的需求?

bq3bfh9z

bq3bfh9z1#

@Mock@InjectMocks注解与Spring无关,因此如何在ProfileController类中自动连接依赖关系并不重要。从您得到的错误来看,您似乎正在运行@SpringBootTest的测试,其中应用程序上下文启动,因此您需要在ProfileService和其他注解上使用@MockBean注解,以便将它们注入到应用程序上下文中。
或者,您可以在不启动整个应用程序上下文的情况下进行基本的单元测试,其中@Mock@InjectMocks注解将按预期工作。只要确保正确初始化模拟即可。最简单的方法是用@ExtendWith(MockitoExtension.class)注解测试类

相关问题