java 如何在编写单元测试时在@Async方法中模拟LocalDate时间?

xqk2d5yq  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(112)

我需要在一个@Async方法中模拟LocalDateTime。但是模拟的localDateTime在Async方法中不起作用。但是删除异步可以按预期工作。到目前为止我已经附上了代码。

public interface ConfigurationProcessor<T> {
    void process(Configuration configuration);
}

下面是上述接口的实现

@Service
    public class ConfigurationProcessoeStudents10Impl implements ConfigurationProcessor<Student> {
        
        private final StudentRepository studentRepository;
    
        @Autowired
        public ConfigurationProcessoeStudents10Impl(StudentRepository studentRepository) {
            this.studentRepository = studentRepository;
            }
        
        @Override
        @Async
        public void process(Configuration configuration) {
            studentRepository.save(Student.builder().Name(configuration.name).Age(configuration.age).RegTime(LocalDateTime.now).build());
        }

}

这是单元测试

@EnableAutoConfiguration
@SpringBootTest
public class StudentsC10IT {

  @Autowired
  ConfigurationProcessor<StudentC10> configurationProcessor;
  
  @Test
  @Tag("VerifyProcess")
  @DisplayName("Verify kafka event consumer from configuration manager")
  void verifyProcess(){
   LocalDateTime lt = LocalDateTime.parse("2018-12-30T19:34:50.63");
    try (MockedStatic<LocalDateTime> localDateTimeMockedFourMonth = Mockito
            .mockStatic(LocalDateTime.class, Mockito.CALLS_REAL_METHODS)) {
      localDateTimeMockedFourMonth.when(LocalDateTime::now).thenReturn(lt));
      configurationProcessor.process();
    }
  }

}

需要知道如何在不使用power mockito的情况下在此@Async方法中模拟LocalDateTime?

2ul0zpep

2ul0zpep1#

MockedStatic是线程本地对象,如Mockito docs中所述。此外,您应该为此对象调用close()
@Async在不同的线程中执行方法,这就是您的测试不起作用的原因。
作为您测试的可能解决方案-禁用异步:参见答案here

相关问题