我的应用中有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
时,它可以正常工作。
为什么会这样?任何帮助是极大的赞赏。 :)
答案 0 :(得分:0)
以以下格式使用
@MockBean(name = "firstDbJdbcTemplate")
private JdbcTemplate firstDbJdbcTemplate;