### Question:
Invocation extends Expression implements HasExpression { @Override public Invocation copy() { final Invocation clonedInvocation = new Invocation(); clonedInvocation.description = Optional.ofNullable(description).map(Description::copy).orElse(null); clonedInvocation.typeRef = Optional.ofNullable(typeRef).map(QName::copy).orElse(null); clonedInvocation.componentWidths = new ArrayList<>(componentWidths); clonedInvocation.expression = Optional.ofNullable(expression).map(Expression::copy).orElse(null); clonedInvocation.binding = binding.stream().map(Binding::copy).collect(Collectors.toList()); return clonedInvocation; } Invocation();  Invocation(final Id id,
                      final Description description,
                      final QName typeRef,
                      final Expression expression,
                      final List<Binding> binding); @Override Invocation copy(); @Override Expression getExpression(); @Override void setExpression(final Expression value); @Override DMNModelInstrumentedBase asDMNModelInstrumentedBase(); List<Binding> getBinding(); @Override List<HasTypeRef> getHasTypeRefs(); @Override int getRequiredComponentWidthCount(); @Override boolean equals(final Object o); @Override int hashCode();  }### Answer:
@Test public void testCopy() { final Invocation source = new Invocation( new Id(INVOCATION_ID), new Description(DESCRIPTION), BuiltInType.BOOLEAN.asQName(), null, new ArrayList<>() ); final Invocation target = source.copy(); assertNotNull(target); assertNotEquals(INVOCATION_ID, target.getId()); assertEquals(DESCRIPTION, target.getDescription().getValue()); assertEquals(BuiltInType.BOOLEAN.asQName(), target.getTypeRef()); assertNull(target.getExpression()); assertTrue(target.getBinding().isEmpty()); }