将@SpyBean与@Qualifier Spring Boot Test一起使用

时间:2017-05-12 06:41:15

标签: spring-boot mockito spring-test

我的应用中有2 DataSource个。

因此,要获得所需的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 */
}

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

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

1 个答案:

答案 0 :(得分:0)

以以下格式使用

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