any()だけでなく、適切なオブジェクトをverifyメソッドに渡したいと思います。私は正しいPreparedStatementを受け取ったことを単体テストできますか?
これを行う方法はありますか?
ラムダメソッドを取得してコピーし、結果を検証に渡すことはできません。 Lambdaは直接テストすることができないため、これは機能しません。
明らかに何かをテストするにしても近接していない私のユニットテスト:
@Test
public void testRunTrigger() {
campaignTrigger.updateCampaignStatus();
verify(jdbcTemplate).update(any(PreparedStatementCreator.class));
assertEquals("UPDATE campaign SET state = 'FINISHED' WHERE state IN ('PAUSED','CREATED','RUNNING') AND campaign_end < ? ", campaignTrigger.UPDATE_CAMPAIGN_SQL);
}
そして、これは私がテストしていたクラスです:
@Component
@Slf4j
public class CampaignTrigger {
final String UPDATE_CAMPAIGN_SQL = String.format("UPDATE campaign SET state = '%s' " +
" WHERE state IN (%s) AND campaign_end < ? ", FINISHED,
Stream.of(PAUSED, CREATED, RUNNING)
.map(CampaignState::name)
.collect(Collectors.joining("','", "'", "'")));
@Autowired
private JdbcTemplate jdbcTemplate;
@Scheduled(cron = "${lotto.triggers.campaign}")
@Timed
void updateCampaignStatus() {
jdbcTemplate.update(con -> {
PreparedStatement callableStatement = con.prepareStatement(UPDATE_CAMPAIGN_SQL);
callableStatement.setTimestamp(1, Timestamp.valueOf(LocalDateTime.now()));
log.debug("Updating campaigns statuses.");
return callableStatement;
});
}
これがあることを何かアドバイス、または理論的な知識それを行う方法ではない、私は非常に感謝します。
適切なパラメータで 'con.prepareStatement(UPDATE_CAMPAIGN_SQL)'と 'callableStatement.setTimestamp(1、Timestamp.valueOf(LocalDateTime.now())')が呼び出されたことを確認できます。 – Morfic
もっと提供してください詳細はどうすればいいですか? – Amiko
そのようなものは 'con'が模擬であるかどうかに依存します。同時に、@ GhostCatが示唆しているように、嘲笑された 'JdbcTemplate'を呼び出すときに引数をキャプチャして、もう一度考えると、より明確でエレガントです – Morfic