spring-boot-test spyBean 注解不注入依赖

Posted

技术标签:

【中文标题】spring-boot-test spyBean 注解不注入依赖【英文标题】:spring-boot-test spyBean annotation not injecting dependency 【发布时间】:2017-04-10 21:42:51 【问题描述】:

我有一个 Spring Boot 应用程序,我最近从 v1.3.3.RELEASE 升级到 v1.4.2.RELEASE。

对于我在 v1.3.3 中的集成测试,我有一个能够成功监视的 bean。我正在使用配置文件 test 和以下 passwordEncoder 运行我的测试,而不是应用程序。

@Bean
@Profile("test")
PasswordEncoder passwordEncoder()
    PasswordEncoder passwordEncoder = new     BCryptPasswordEncoder(ApplicationConstants.CRYPT_LOG_ROUNDS);
    final String pwdHash = "$$CONST_HASH$$";        
    PasswordEncoder peSpy = spy(passwordEncoder);
    Mockito.when(peSpy.encode("TEST_USER_CRED")).thenReturn(pwdHash);
    return peSpy;

我正在升级到 v1.4.2.RELEASE,并希望使用 spyBean 注释来模拟单个方法而不依赖于配置文件。

我已对我的测试方法进行了以下更改以进行尝试 -

@RunWith(SpringRunner.class)
@TestExecutionListeners( DependencyInjectionTestExecutionListener.class,DirtiesContextTestExecutionListener.class,DbUnitTestExecutionListener.class )
@DbUnitConfiguration(dataSetLoader = ReplacementDataSetLoader.class)
@SpringBootTest(classes = Application.class,webEnvironment=WebEnvironment.RANDOM_PORT)
public class MockTests 

    @SpyBean
    PasswordEncoder passwordEncoder;

    private MockMvc mockMvc;

    @Before
    public void setup() throws Exception 
        this.mockMvc = webAppContextSetup(webApplicationContext)
                .apply(springSecurity())
                .build();
        final String pwdHash = "$$CONST_HASH$$";
        Mockito.when(peSpy.encode("TEST_USER_CRED")).thenReturn(pwdHash);
    

但是,当我尝试上述方法时,我在 Mockito.when 声明中得到了 NPE。我有什么遗漏吗?

我尝试使用 MockBean 代替 SpyBean,但仍然没有任何变化。我还尝试将间谍语句移动到 @Test 方法而不是 @Before 并且仍然具有相同的 NPE。

【问题讨论】:

【参考方案1】:

问题出在TestExecutionListeners 注释上。在现有侦听器之外添加 MockitoTestExecutionListener 修复了模拟/间谍 bean 的注入。

【讨论】:

以上是关于spring-boot-test spyBean 注解不注入依赖的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Test(转)

软件测试Junit单元测试

软件测试Junit单元测试

软件测试Junit单元测试

在 ServletContext 中找不到属性 ServerContainer

在 Kotlin 中创建 Spring 的 ParameterizedTypeReference 实例