- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我设置特定日期时,我正在努力测试我的端点。
我不想使用 PowerMock 来模拟静态方法,而是决定更改我的服务的实现并使用 LocalDate.now(Clock clock) 实现来更容易地测试它。
我添加到我的 SpringBootApplication 类:
@Bean
public Clock clock() {
return Clock.systemDefaultZone();
}
并将其自动连接到我的服务
@Autowired
private Clock clock;
并在我的实现中使用它:
LocalDateTime localDate = LocalDateTime.now(clock);
在测试方面我模拟了时钟
private final static LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@Mock
private Clock clock;
private Clock fixedClock;
并将其用作:
MockitoAnnotations.initMocks(this);
//tell your tests to return the specified LOCAL_DATE when calling LocalDate.now(clock)
fixedClock = Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
doReturn(fixedClock.instant()).when(clock).instant();
doReturn(fixedClock.getZone()).when(clock).getZone();
ResponseEntity<String> response = restTemplate.postForEntity(base.toString(), request, String.class);
当我调试它时,fixedClock
具有我预期的值 FixedClock[2020-07-05T09:05:00Z,CET]
。相反,如果我在服务实现上放置断点,localDate
变量的值为 2020-07-09
- .now()
。
我的问题是:为什么 localDate
变量没有 fixedClock
变量的值?
非常感谢您的宝贵时间!
稍后编辑:
这是服务的构造函数:
@Autowired
public SavingAccountService(
SavingAccountRepository savingAccountRepository, UserRepository userRepository, Clock clock) {
this.savingAccountRepository = savingAccountRepository;
this.userRepository = userRepository;
this.clock = clock;
}
我的 TestClass 上的注释:
RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ChallengeApplication.class)
@ActiveProfiles("test")
public class SavingAccountTest {
@Mock
private Clock clock;
private Clock fixedClock;
@InjectMocks
private SavingAccountService savingAccountService;
@Autowired
private TestRestTemplate restTemplate;
private URL base;
@LocalServerPort
int port;
我还想提一下,在我的测试中,我调用的是 Controller 而不是服务。
private final SavingAccountService savingAccountService;
public SavingAccountRestController(SavingAccountService savingAccountService) {
this.savingAccountService = savingAccountService;
}
@Override
@PostMapping
public ResponseEntity<?> newSavingAccount(@RequestBody SavingAccount savingAccount) {
EntityModel<SavingAccount> newSavingAccount = savingAccountService.newSavingAccount(savingAccount);
return new ResponseEntity<>(newSavingAccount, HttpStatus.CREATED);
}
最佳答案
问题
您在测试中创建了一个使用注入(inject)模拟的 SavingAccountService。
@InjectMocks
private SavingAccountService savingAccountService;
问题是这不是您的 Controller 使用的服务。Spring boot 测试创建应用程序上下文中定义的 bean, Autowiring 它们,并愉快地忽略测试中定义的服务的存在。
解决方案
你必须让 Spring boot 知道固定时间的 Clock bean
选项 1:模拟 bean
你来定义
@MockBean
private Clock clock;
private Clock fixedClock;
你应该可以开始了。
我仍然觉得这个方法很复杂,我想将固定时钟作为 bean 传递给 Spring Boot 上下文,而不是创建模拟。
选项 2:指定用于加载 ApplicationContext 的组件类。
在你的测试目录中创建一个新的配置类
@Configuration
public class FakeClockConfig {
private final static LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@Bean
public Clock clock() {
return Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
}
}
让 Spring Boot 测试知道这个额外的配置
@SpringBootTest(webEnvironment = RANDOM_PORT,
classes = {ChallengeApplication.class, FakeClockConfig.class})
我觉得这种方法更可取,你已经自己指定了一个组件类。
恒定时钟将取代您原来的时钟
选项 3:@TestConfiguration
参见 Spring boot – @TestConfiguration
@TestConfiguration is specialized form of @Configuration that can be used to define additional beans or customizations for a test.
In spring boot, any beans configured in a top-level class annotated with @TestConfiguration will not be picked up via component scanning. We must explicitly register the @TestConfiguration class with the class that contains the test cases.
There are two ways to include this additional test configuration for tests:
1.1. @Import annotation
1.2. Static nested classes
让我们采用后一种方法:
@SpringBootTest(properties = "spring.main.allow-bean-definition-overriding=true")
public class ProjetRepositoryTest {
private static final LocalDate WEEKEND = LocalDate.of(2020, 07, 05);
@TestConfiguration
static class FakeClockConfig {
@Bean
public Clock clock() {
return Clock.fixed(WEEKEND.atTime(9, 5).toInstant(ZoneOffset.UTC), ZoneId.of("CET"));
}
}
}
请注意,此方法会创建额外的 bean,因此我需要允许覆盖 bean。
参见 Spring-Boot 2.1.x and overriding bean definition
其他备注
您似乎正在使用 TestRestTemplate 进行后端测试。您可能更喜欢使用 MockMvc。
参见 Difference between MockMvc and RestTemplate in integration tests
关于java - 使用 Clock.fixed() 模拟 LocalDate.now(clock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62817126/
这个问题在这里已经有了答案: What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX? (4
我只是尝试使用 jasmine 在 javascript/coffeescript 中进行单元测试,非常好。 我一直在尝试使用 jasmine.Clock.Mock() 来提前并触发 setTimeo
现在使用 emacs org 模式大约一个月来跟踪我所有的项目和任务。 我全天为所有事件计时,而不仅仅是与工作相关的事件。 我的问题是——我经常忘记打卡参加一项新事件(比如吃午饭)。当我返回并打卡回到
我在看 Clock来自java的类,以便我可以将其作为依赖项注入(inject)以获得更好的可测试性。但是我不明白这两种方法的区别systemUTC和 systemDefaultZone . Inst
当我设置特定日期时,我正在努力测试我的端点。 我不想使用 PowerMock 来模拟静态方法,而是决定更改我的服务的实现并使用 LocalDate.now(Clock clock) 实现来更容易地测试
我有一个员工“上类打卡”表,具有开始时间和结束时间属性。每位员工上下类打卡,表格类似这样: Employee_no Start time End time 16
Linux perf工具(前段时间命名为 perf_events)有几个内置的通用软件事件。其中最基本的两个是:task-clock和 cpu_clock (内部称为 PERF_COUNT_SW_CP
我的方法之一中有以下代码 ZonedDateTime current = Instant.now().atZone(ZoneId.of(AMERICA_NEW_YORK)); 我想在 JUnit 测试
我正在使用 sf::Clock 来控制循环。 我想知道是否允许我使用超过 1 个 sf::Clock,如果允许,是否所有“时钟”都将正常运行并按预期工作在所有操作系统上。 例如: sf::Clock
假设您有一个 (1) Intel/AMD x86-64 位 2 GHz 8 核处理器。 8 个内核中的每一个是否都以完整的 2 GHz 运行,或者每个内核是否以完整的 2 GHz 时钟的一部分运行(例
对于 java 8 下面的代码 1. System.out.println(LocalDateTime.now(Clock.systemDefaultZone())); 2. System.o
我有以下使用Chatterbot第三方库的代码:。当我尝试使用代码时,从Visual Studio收到如下错误:。我安装了以下程序包:。我尝试了使用Python3.9和3.11以及Chatterbot
我有以下使用Chatterbot第三方库的代码:。当我尝试使用代码时,从Visual Studio收到如下错误:。我安装了以下程序包:。我尝试了使用Python3.9和3.11以及Chatterbot
我有以下使用Chatterbot第三方库的代码:。当我尝试使用代码时,从Visual Studio收到如下错误:。我安装了以下程序包:。我尝试了使用Python3.9和3.11以及Chatterbot
我有一个相对简单的要求:我希望我在 KVM 下创建的 CentOS 客户机上的时钟从 VM 的第一次启动就与它们的 CentOS 主机同步。 在它们启动并运行后将它们与 NTP 同步很容易。但是,如果
谁能告诉我如何找到STM32F429的APB1时钟频率?以及如何计算STM32F429的波特率。 P.S...请不要告诉我引用引用手册,因为这些工作已经完成,我想告诉我 APB1 时钟频率的确切值 谢
我在 LAN 上有 5 台服务器,没有 Internet 连接。我需要他们保持时钟同步。 我可以将它们配置为 NTP 对等体,并为其中一个的本地时钟设置较高的层数。这样,其他四个就会与该时钟同步。 我
让我们假设我们有许多系统连接在本地网络中并且没有连接到互联网。确保每个时钟同步的最佳方法是什么?它们不一定要与 UTC 时间同步,但在它们之间保持同步就足够了。 我曾想过通过在其中一个系统中设置 NT
我对 clock() 有疑问在运行 32 位版本的 Debian 6.0.3 的机器上。它似乎总是返回 0。使用 this example program 时,我得到以下输出: Calculating
我正在尝试编写一个程序来比较快速排序和插入排序函数所花费的时间,具体取决于数组中元素的数量。这是我想出的代码: #include #include #include //prototypes o
我是一名优秀的程序员,十分优秀!