通过注释类创建带有限定符的@MockBean?

mas*_*ick 12 java spring-test spring-bean spring-boot

在我的 Spring Boot 测试中,我使用了 2 个具有不同限定符的模拟 bean:

@RunWith(SpringRunner.class)
@SpringBootTest
class HohoTest {
    @MockBean @Qualifier("haha") IHaha ahaha;
    @MockBean @Qualifier("hoho") IHaha ohoho;
}
Run Code Online (Sandbox Code Playgroud)

由于我没有明确使用这些 bean,我宁愿将它们从类主体中移开,因为@MockBean注释现在是可重复的:

@RunWith(SpringRunner.class)
@SpringBootTest
@MockBean(IHaha.class)
@MockBean(IHaha.class)
class HohoTest {}
Run Code Online (Sandbox Code Playgroud)

但是,我还需要传入一个限定符,因为它们具有相同的类型。关于如何实现这一目标的任何想法?

Vla*_*liy 19

因为使用注释@Qualifier意味着通过名称选择 bean,所以您可以使用如下代码为模拟设置名称:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {JsonMapperConfig.class})
public class IntegrationFlowTest {

    @MockBean(name = "s3MessageRepository")
    private S3Repository s3MessageRepository;

// etc
Run Code Online (Sandbox Code Playgroud)


obe*_*ies 6

如果可以将模拟定义完全移出测试类,您还可以在单​​独的@Configuration类中创建模拟:

@Configuration
public class MockConfiguration
{
    @Bean @Qualifier("haha")
    public IHaha ahaha() {
        return Mockito.mock(IHaha.class);
    }
    @Bean @Qualifier("hoho")
    public IHaha ohoho() {
        return Mockito.mock(IHaha.class);
    }
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*nen 5

在类级别声明时@MockBean,目前不支持提供qualifier

如果您想获得此类支持,我建议您在 Spring Boot 问题跟踪器中请求

否则,您将需要继续@MockBean在 旁边的字段上声明@Qualifier