【发布时间】: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