### Question:
AbstractCanonCommand implements CanonCommand<R>, TargetRefCommand<R> { @Override public Instant getExecutionStartTime() { if (executionStartTime == null) throw new IllegalStateException("Command not started yet"); return executionStartTime; } protected  AbstractCanonCommand(); protected  AbstractCanonCommand(final AbstractCanonCommand<R> toCopy); @SuppressWarnings("unchecked") @Override AbstractCanonCommand<R> copy(); @Override final void run(); @Override CanonCommand<R> setTargetRef(final EdsBaseRef targetRef); final Optional<EdsBaseRef> getTargetRef(); @Override TargetRefType getTargetRefType(); @Override Instant getCreateTime(); @Override Instant getExecutionStartTime(); @Override boolean hasExecutionStarted(); @Override Instant getExecutionEndTime(); @Override boolean hasExecutionEnded(); @Override R get(); @Override Optional<Duration> getTimeout(); @Override CanonCommand<R> setTimeout(final Duration timeout);  }### Answer:
@Test void getExecutionStartTime() { doNothingCommand.run(); Assertions.assertNotNull(doNothingCommand.getExecutionStartTime()); }
@Test void getExecutionStartTimeThrowsWhenNotRan() { Assertions.assertThrows(IllegalStateException.class, () -> doNothingCommand.getExecutionStartTime()); }