@Test
  public void shouldShallowCopyFieldValuesIntoMock() throws Exception {
    // given
    from.defaultField = "foo";
    from.instancePublicField = new SomeOtherObject();
    from.privateField = 1;
    from.privateTransientField = 2;
    from.protectedField = 3;

    assertNotEquals(from.defaultField, to.defaultField);
    assertNotEquals(from.instancePublicField, to.instancePublicField);
    assertNotEquals(from.privateField, to.privateField);
    assertNotEquals(from.privateTransientField, to.privateTransientField);
    assertNotEquals(from.protectedField, to.protectedField);

    // when
    tool.copyToMock(from, to);

    // then
    assertEquals(from.defaultField, to.defaultField);
    assertEquals(from.instancePublicField, to.instancePublicField);
    assertEquals(from.privateField, to.privateField);
    assertEquals(from.privateTransientField, to.privateTransientField);
    assertEquals(from.protectedField, to.protectedField);
  }
  @Test
  public void shouldContinueEvenIfThereAreProblemsCopyingSingleFieldValue() throws Exception {
    // given
    tool.fieldCopier = mock(FieldCopier.class);

    doNothing()
        .doThrow(new IllegalAccessException())
        .doNothing()
        .when(tool.fieldCopier)
        .copyValue(anyObject(), anyObject(), any(Field.class));

    // when
    tool.copyToMock(from, to);

    // then
    verify(tool.fieldCopier, atLeast(3)).copyValue(any(), any(), any(Field.class));
  }
  @Test
  public void shouldShallowCopyLinkedListIntoMock() throws Exception {
    // given
    LinkedList fromList = new LinkedList();
    LinkedList toList = mock(LinkedList.class);

    // when
    tool.copyToMock(fromList, toList);

    // then no exception is thrown
  }
  @Test
  public void shouldShallowCopyTransientPrivateFields() throws Exception {
    // given
    from.privateTransientField = 1000;
    assertNotEquals(1000, to.privateTransientField);

    // when
    tool.copyToMock(from, to);

    // then
    assertEquals(1000, to.privateTransientField);
  }
  @Test
  public void shouldShallowCopyBasicFinalField() throws Exception {
    // given
    assertEquals(100, from.finalField);
    assertNotEquals(100, to.finalField);

    // when
    tool.copyToMock(from, to);

    // then
    assertEquals(100, to.finalField);
  }
  @Test
  public void shouldEnableAndThenDisableAccessibility() throws Exception {
    // given
    Field privateField = SomeObject.class.getDeclaredField("privateField");
    assertFalse(privateField.isAccessible());

    // when
    tool.copyToMock(from, to);

    // then
    privateField = SomeObject.class.getDeclaredField("privateField");
    assertFalse(privateField.isAccessible());
  }
  @Test
  public void shouldCopyValuesOfInheritedFields() throws Exception {
    // given
    ((InheritMe) from).privateInherited = "foo";
    ((InheritMe) from).protectedInherited = "bar";

    assertNotEquals(((InheritMe) from).privateInherited, ((InheritMe) to).privateInherited);
    assertNotEquals(((InheritMe) from).privateInherited, ((InheritMe) to).privateInherited);

    // when
    tool.copyToMock(from, to);

    // then
    assertEquals(((InheritMe) from).privateInherited, ((InheritMe) to).privateInherited);
    assertEquals(((InheritMe) from).privateInherited, ((InheritMe) to).privateInherited);
  }
  @Test
  public void shouldBeAbleToCopyFromRealObjectToRealObject() throws Exception {

    // given
    from.defaultField = "defaultField";
    from.instancePublicField = new SomeOtherObject();
    from.privateField = 1;
    from.privateTransientField = 2;
    from.protectedField = "protectedField";
    from.protectedInherited = "protectedInherited";
    to = new SomeObject(0);

    // when
    tool.copyToRealObject(from, to);

    // then
    assertEquals(from.defaultField, to.defaultField);
    assertEquals(from.instancePublicField, to.instancePublicField);
    assertEquals(from.privateField, to.privateField);
    assertEquals(from.privateTransientField, to.privateTransientField);
    assertEquals(from.protectedField, to.protectedField);
    assertEquals(from.protectedInherited, to.protectedInherited);
  }