[英]How to Inject Clock.getInstance() in Spring Boot?
我想對一些調用System.currentTimeMillis()
代碼進行單元測試。 正如這個答案指出的那樣,一個很好的方法是用Clock.getInstance().currentTimeMillis()
替換對System.currentTimeMillis()
調用。 然后,您可以對Clock.getInstance()
執行依賴注入,例如在單元測試中用模擬替換它。
所以,我的問題是對此的跟進。 你如何配置Spring Boot在運行時注入Clock.getInstance()
?
如果可能,我更願意使用注釋而不是 XML 來做到這一點。
另外,如果可能的話,我想這樣做,我可以簡單地使用@Mock
和@InjectMocks
和MockitoJUnitRunner
將模擬時鍾注入單元測試。
在您的配置類中,您可以執行以下操作:
@Configuration
public class Config {
@Bean
public Clock clock() {
return Clock.fixed(...);
}
}
在你的課堂上,你可以@Autowire
它:
public class ClockUser {
private Clock clock;
public ClockUser(Clock clock, ...) {
this.clock = clock;
}
}
(請注意,我在這里使用了構造函數注入,請參閱本文標題為基於構造函數或基於 setter 的 DI 的部分、 Oliver Gierke 的評論(即 Spring Data 項目負責人)以及google以獲取更多信息。)
然后你可以在另一個測試@Configuration
類或你的JUnit
測試中創建你的模擬:
@Bean
public Clock {
Clock clock = Mockito.mock(Clock.class);
.... ("when" rules)
return clock;
}
它可以在單元測試中不使用模擬來完成。
在您的 Spring 應用程序設置中,只需添加以下內容。 它可以在您的@SpringBootApplication
或@Configuration
@Bean
public Clock clock() {
return Clock.systemDefaultZone();
}
這將確保您的生產代碼中有一個正在運行的時鍾。
對於您的測試設置,您可以選擇將相同的 Clock bean 添加到您的測試配置中。 這將使不依賴於特定時間的測試無需修改即可運行。
當您有一個需要依賴特定時間的測試用例時,您只需通過在測試用例中添加以下作為內部類來覆蓋測試配置。
@RunWith(SpringRunner.class)
@SpringBootTest
public class YourServiceTest {
@Autowired
private YourService yourService;
...
@TestConfiguration
public static class Config {
@Bean
public Clock clock() {
return Clock.fixed(Instant.parse("2021-09-10T12:00:00Z"), ZoneOffset.UTC);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.