【问题标题】:Using @SpyBean with @Qualifier Spring Boot Test将 @SpyBean 与 @Qualifier Spring Boot 测试一起使用
【发布时间】:2017-05-12 06:41:15
【问题描述】:

我的应用中有 2 个DataSources。

所以,为了获得所需的JdbcTemplate,我使用@Qualifier。但是,当我喜欢下面时,测试会运行......但会无限期地等待,如果在“被测方法”中有任何使用 JdbcTemplate

@Service
@Transactional
public class SampleDatabaseService {

    @Autowired
    @Qualifier("firstDbJdbcTemplate")
    private JdbcTemplate firstDbJdbcTemplate;

    @Autowired
    @Qualifier("secondDbJdbcTemplate")
    private JdbcTemplate secondDbJdbcTemplate;

    @Cacheable("status")
    public Map<String, Device> readAllValidDeviceStatus() {
        Map<String, Device> allDeviceStatuses = new HashMap<>();
        //Stops at below line indefinitely if "SpyBean" is used
        List<StatusDetail> statusDetails = firstDbJdbcTemplate
               .query(SqlQueries.READ_DEVICE_STATUS, BeanPropertyRowMapper.newInstance(StatusDetail.class)); 

        statusDetails
               .stream()
               .filter(deviceStatus -> deviceStatus.getName() != "Some Invalid Name")
               .forEach(deviceStatus -> allDeviceStatuses
                  .put(deviceStatus.getName(), buildDevice(deviceStatus)));
        return allDeviceStatuses;
    }

/** More Stuff **/

}

测试

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Transactional
@Rollback
@ActiveProfiles("test")
public class SampleDatabaseServiceTest {

    @SpyBean
    @Qualifier("firstDbJdbcTemplate")
    private JdbcTemplate firstDbJdbcTemplate;

    @Autowired
    private SampleDatabaseService serviceUnderTest;

    @Before
    public void populateTables() {
        //Insert some Dummy Records in "InMemory HSQL DB" using firstDbJdbcTemplate
    }


    @Test
    public void testReadAllValidDeviceStatus() {
        // When
        Map<String, Device> allDeviceStatuses = serviceUnderTest.readAllValidDeviceStatus();

        // Then
        assertThat(allDeviceStatuses).isNotNull().isNotEmpty();
        // More checks
    }
    /* More Tests */
}

但是,当我在Test 中将@SpyBean 替换为@Autowired 时,它可以正常工作。

为什么会这样?任何帮助是极大的赞赏。 :)

【问题讨论】:

    标签: spring-boot mockito spring-test


    【解决方案1】:

    按以下格式使用

      @MockBean(name = "firstDbJdbcTemplate") 
      private JdbcTemplate firstDbJdbcTemplate;
    

    【讨论】:

    • 我在使用name= 时遇到了问题并修复了我用一个额外的@Qualified 注释修复了它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2021-01-02
    • 2020-03-09
    • 2016-01-29
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多