12637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin/*
22637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * Copyright (c) 2007 Mockito contributors
32637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * This program is made available under the terms of the MIT License.
42637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin */
52637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
62637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinpackage org.mockitousage.stubbing;
72637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
82637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.junit.Test;
92637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.mockito.internal.stubbing.answers.ClonesArguments;
102637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport org.mockitoutil.TestBase;
112637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
122637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport java.util.List;
132637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
142637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport static junit.framework.TestCase.assertNotNull;
152637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinimport static org.mockito.Mockito.*;
162637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
172637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffinpublic class CloningParameterTest extends TestBase {
182637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
192637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    @Test
202637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public void shouldVerifyEvenIfArgumentsWereMutated() throws Exception {
212637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
222637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        // given
232637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        EmailSender emailSender = mock(EmailSender.class, new ClonesArguments());
242637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
252637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        // when
262637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        businessLogic(emailSender);
272637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
282637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        // then
292637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        verify(emailSender).sendEmail(1, new Person("Wes"));
302637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
312637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
322637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    private void businessLogic(EmailSender emailSender) {
332637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        Person person = new Person("Wes");
342637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        emailSender.sendEmail(1, person);
352637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        person.emailSent();
362637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
372637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
382637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    @Test
392637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public void shouldReturnDefaultValueWithCloningAnswer() throws Exception {
402637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
412637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        // given
422637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        EmailSender emailSender = mock(EmailSender.class, new ClonesArguments());
432637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        when(emailSender.getAllEmails(new Person("Wes"))).thenAnswer(new ClonesArguments());
442637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
452637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        // when
462637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        List<?> emails = emailSender.getAllEmails(new Person("Wes"));
472637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
482637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        // then
492637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        assertNotNull(emails);
502637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
512637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
522637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public class Person {
532637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
542637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        private final String name;
552637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        private boolean emailSent;
562637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
572637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        public Person(String name) {
582637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            this.name = name;
592637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
602637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
612637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        public void emailSent() {
622637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            emailSent = true;
632637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
642637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
652637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        @Override
662637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        public int hashCode() {
672637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            final int prime = 31;
682637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            int result = 1;
692637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            result = prime * result + getOuterType().hashCode();
702637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            result = prime * result + (emailSent ? 1231 : 1237);
712637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            result = prime * result + ((name == null) ? 0 : name.hashCode());
722637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            return result;
732637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
742637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
752637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        @Override
762637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        public boolean equals(Object obj) {
772637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            if (this == obj)
782637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                return true;
792637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            if (obj == null)
802637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                return false;
812637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            if (getClass() != obj.getClass())
822637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                return false;
832637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            Person other = (Person) obj;
842637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            if (!getOuterType().equals(other.getOuterType()))
852637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                return false;
862637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            if (emailSent != other.emailSent)
872637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                return false;
882637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            if (name == null) {
892637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                if (other.name != null)
902637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                    return false;
912637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            } else if (!name.equals(other.name))
922637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin                return false;
932637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            return true;
942637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
952637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
962637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        private CloningParameterTest getOuterType() {
972637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            return CloningParameterTest.this;
982637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
992637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
1002637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
1012637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
1022637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public interface EmailSender {
1032637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
1042637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        void sendEmail(int i, Person person);
1052637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
1062637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        List<?> getAllEmails(Person person);
1072637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
1082637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
1092637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin}
110