簡體   English   中英

如何在 Spring Boot 中注入 Clock.getInstance()?

[英]How to Inject Clock.getInstance() in Spring Boot?

我想對一些調用System.currentTimeMillis()代碼進行單元測試。 正如這個答案指出的那樣,一個很好的方法是用Clock.getInstance().currentTimeMillis()替換對System.currentTimeMillis()調用。 然后,您可以對Clock.getInstance()執行依賴注入,例如在單元測試中用模擬替換它。

所以,我的問題是對此的跟進。 你如何配置Spring Boot在運行時注入Clock.getInstance()

如果可能,我更願意使用注釋而不是 XML 來做到這一點。

另外,如果可能的話,我想這樣做,我可以簡單地使用@Mock@InjectMocksMockitoJUnitRunner將模擬時鍾注入單元測試。

在您的配置類中,您可以執行以下操作:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM