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

mka*_*erg 2 java spring unit-testing spring-boot

我想对一些调用的代码进行单元测试System.currentTimeMillis()。由于这个答案所指出的,要做到这一点的好方法是调用替换到System.currentTimeMillis()Clock.getInstance().currentTimeMillis()。然后,您可以对进行依赖注入Clock.getInstance(),例如在单元测试中将其替换为模拟。

因此,我的问题是对此的后续行动。如何配置Spring BootClock.getInstance()在运行时注入?

如果可能的话,我宁愿使用批注而不是XML来做到这一点。

另外,如果可能的话,我愿意做这样的方式,我可以简单地使用@Mock,并@InjectMocksMockitoJUnitRunner注入一个模拟时钟到一个单元测试。

Dov*_*vmo 5

在配置类中,您可以执行以下操作:

@Configuration
public class Config { 
    @Bean
    public Clock { 
        return Clock.fixed(...);
    } 
} 
Run Code Online (Sandbox Code Playgroud)

在您的课程中,您可以@Autowire

public class ClockUser {

private Clock clock;

    public ClockUser(Clock clock, ...) {
        this.clock = clock;
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意,我在这里使用构造函数注入,请参阅本文标题为基于构造函数或基于setter的DI的 部分Oliver Gierke的评论(即Spring Data项目的负责人)和google,以获取更多信息。)

然后,您可以在另一个测试@Configuration类或测试中创建模拟对象JUnit

@Bean
public Clock {
    Clock clock = Mockito.mock(Clock.class);
    .... ("when" rules)
    return clock;
} 
Run Code Online (Sandbox Code Playgroud)

  • 由于固定意味着它总是在同一时间返回,因此您不会在非测试配置中使用它。它应该使用诸如 systemUTC、systemDefaultZone 等。 (4认同)