### Question:
ObserverAction implements Sc2ApiSerializable<Sc2Api.ObserverAction> { public static Builder observerAction() { return new Builder(); } private  ObserverAction(ActionObserverPlayerPerspective playerPerspective); private  ObserverAction(ActionObserverCameraMove cameraMove); private  ObserverAction(ActionObserverCameraFollowPlayer cameraFollowPlayer); private  ObserverAction(ActionObserverCameraFollowUnits cameraFollowUnits); static Builder observerAction(); @Override Sc2Api.ObserverAction toSc2Api(); Optional<ActionObserverPlayerPerspective> getPlayerPerspective(); Optional<ActionObserverCameraMove> getCameraMove(); Optional<ActionObserverCameraFollowPlayer> getCameraFollowPlayer(); Optional<ActionObserverCameraFollowUnits> getCameraFollowUnits(); @Override boolean equals(Object o); @Override int hashCode(); @Override String toString();  }### Answer:
@Test void throwsExceptionWhenThereIsNoActionCase() { assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> observerAction().of((ActionObserverPlayerPerspective) nothing())) .withMessage("player perspective is required"); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> observerAction().of((ActionObserverCameraMove) nothing())) .withMessage("camera move is required"); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> observerAction().of((ActionObserverCameraFollowPlayer) nothing())) .withMessage("camera follow player is required"); assertThatExceptionOfType(IllegalArgumentException.class) .isThrownBy(() -> observerAction().of((ActionObserverCameraFollowUnits) nothing())) .withMessage("camera follow units is required"); }