blob: bc3bfb6cbb3ada3629fcf3512d3eef6add8d86f8 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitousage.customization;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.exceptions.misusing.NotAMockException;
import org.mockito.exceptions.verification.NoInteractionsWanted;
import org.mockito.exceptions.verification.VerificationInOrderFailure;
import org.mockito.exceptions.verification.WantedButNotInvoked;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.mockitousage.IMethods;
import org.mockitousage.MethodsImpl;
import org.mockitoutil.TestBase;
import java.util.Set;
import static junit.framework.TestCase.fail;
import static org.mockito.BDDMockito.*;
public class BDDMockitoTest extends TestBase {
@Mock
IMethods mock;
@Test
public void should_stub() throws Exception {
given(mock.simpleMethod("foo")).willReturn("bar");
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("bar");
Assertions.assertThat(mock.simpleMethod("whatever")).isEqualTo(null);
}
@Test
public void should_stub_with_throwable() throws Exception {
given(mock.simpleMethod("foo")).willThrow(new SomethingWasWrong());
try {
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
public void should_stub_with_throwable_class() throws Exception {
given(mock.simpleMethod("foo")).willThrow(SomethingWasWrong.class);
try {
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
@SuppressWarnings("unchecked")
public void should_stub_with_throwable_classes() throws Exception {
// unavoidable 'unchecked generic array creation' warning (from JDK7 onward)
given(mock.simpleMethod("foo")).willThrow(SomethingWasWrong.class, AnotherThingWasWrong.class);
try {
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
public void should_stub_with_answer() throws Exception {
given(mock.simpleMethod(anyString())).willAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
return invocation.getArgument(0);
}
});
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");
}
@Test
public void should_stub_with_will_answer_alias() throws Exception {
given(mock.simpleMethod(anyString())).will(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
return invocation.getArgument(0);
}
});
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");
}
@Test
public void should_stub_consecutively() throws Exception {
given(mock.simpleMethod(anyString()))
.willReturn("foo")
.willReturn("bar");
Assertions.assertThat(mock.simpleMethod("whatever")).isEqualTo("foo");
Assertions.assertThat(mock.simpleMethod("whatever")).isEqualTo("bar");
}
@Test
public void should_return_consecutively() throws Exception {
given(mock.objectReturningMethodNoArgs())
.willReturn("foo", "bar", 12L, new byte[0]);
Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo("foo");
Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo("bar");
Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo(12L);
Assertions.assertThat(mock.objectReturningMethodNoArgs()).isEqualTo(new byte[0]);
}
@Test
public void should_stub_consecutively_with_call_real_method() throws Exception {
MethodsImpl mock = mock(MethodsImpl.class);
willReturn("foo").willCallRealMethod()
.given(mock).simpleMethod();
Assertions.assertThat(mock.simpleMethod()).isEqualTo("foo");
Assertions.assertThat(mock.simpleMethod()).isEqualTo(null);
}
@Test
public void should_stub_void() throws Exception {
willThrow(new SomethingWasWrong()).given(mock).voidMethod();
try {
mock.voidMethod();
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
public void should_stub_void_with_exception_class() throws Exception {
willThrow(SomethingWasWrong.class).given(mock).voidMethod();
try {
mock.voidMethod();
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
@SuppressWarnings("unchecked")
public void should_stub_void_with_exception_classes() throws Exception {
willThrow(SomethingWasWrong.class, AnotherThingWasWrong.class).given(mock).voidMethod();
try {
mock.voidMethod();
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
public void should_stub_void_consecutively() throws Exception {
willDoNothing()
.willThrow(new SomethingWasWrong())
.given(mock).voidMethod();
mock.voidMethod();
try {
mock.voidMethod();
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
public void should_stub_void_consecutively_with_exception_class() throws Exception {
willDoNothing()
.willThrow(SomethingWasWrong.class)
.given(mock).voidMethod();
mock.voidMethod();
try {
mock.voidMethod();
fail();
} catch (SomethingWasWrong expected) {
}
}
@Test
public void should_stub_using_do_return_style() throws Exception {
willReturn("foo").given(mock).simpleMethod("bar");
Assertions.assertThat(mock.simpleMethod("boooo")).isEqualTo(null);
Assertions.assertThat(mock.simpleMethod("bar")).isEqualTo("foo");
}
@Test
public void should_stub_using_do_answer_style() throws Exception {
willAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) throws Throwable {
return invocation.getArgument(0);
}
})
.given(mock).simpleMethod(anyString());
Assertions.assertThat(mock.simpleMethod("foo")).isEqualTo("foo");
}
@Test
public void should_stub_by_delegating_to_real_method() throws Exception {
//given
Dog dog = mock(Dog.class);
//when
willCallRealMethod().given(dog).bark();
//then
Assertions.assertThat(dog.bark()).isEqualTo("woof");
}
@Test
public void should_stub_by_delegating_to_real_method_using_typical_stubbing_syntax() throws Exception {
//given
Dog dog = mock(Dog.class);
//when
given(dog.bark()).willCallRealMethod();
//then
Assertions.assertThat(dog.bark()).isEqualTo("woof");
}
@Test
public void should_all_stubbed_mock_reference_access() throws Exception {
Set<?> expectedMock = mock(Set.class);
Set<?> returnedMock = given(expectedMock.isEmpty()).willReturn(false).getMock();
Assertions.assertThat(returnedMock).isEqualTo(expectedMock);
}
@Test(expected = NotAMockException.class)
public void should_validate_mock_when_verifying() {
then("notMock").should();
}
@Test(expected = NotAMockException.class)
public void should_validate_mock_when_verifying_with_expected_number_of_invocations() {
then("notMock").should(times(19));
}
@Test(expected = NotAMockException.class)
public void should_validate_mock_when_verifying_no_more_interactions() {
then("notMock").should();
}
@Test(expected = WantedButNotInvoked.class)
public void should_fail_for_expected_behavior_that_did_not_happen() {
then(mock).should().booleanObjectReturningMethod();
}
@Test
public void should_pass_for_expected_behavior_that_happened() {
mock.booleanObjectReturningMethod();
then(mock).should().booleanObjectReturningMethod();
then(mock).shouldHaveNoMoreInteractions();
}
@Test
public void should_validate_that_mock_did_not_have_any_interactions() {
then(mock).shouldHaveZeroInteractions();
}
@Test
public void should_validate_that_mock_had_no_interactions() {
then(mock).shouldHaveNoInteractions();
}
@Test
public void should_fail_when_mock_had_unwanted_interactions() {
mock.booleanObjectReturningMethod();
try {
then(mock).shouldHaveZeroInteractions();
fail("should have reported this interaction wasn't wanted");
} catch (NoInteractionsWanted expected) {
}
}
@Test
public void should_fail_when_mock_had_more_interactions_than_expected() {
mock.booleanObjectReturningMethod();
mock.byteObjectReturningMethod();
then(mock).should().booleanObjectReturningMethod();
try {
then(mock).shouldHaveNoMoreInteractions();
fail("should have reported that no more interactions were wanted");
} catch (NoInteractionsWanted expected) {
}
}
@Test
public void should_pass_for_interactions_that_happened_in_correct_order() {
mock.booleanObjectReturningMethod();
mock.arrayReturningMethod();
InOrder inOrder = inOrder(mock);
then(mock).should(inOrder).booleanObjectReturningMethod();
then(mock).should(inOrder).arrayReturningMethod();
}
@Test
public void should_fail_for_interactions_that_were_in_wrong_order() {
InOrder inOrder = inOrder(mock);
mock.arrayReturningMethod();
mock.booleanObjectReturningMethod();
then(mock).should(inOrder).booleanObjectReturningMethod();
try {
then(mock).should(inOrder).arrayReturningMethod();
fail("should have raise in order verification failure on second verify call");
} catch (VerificationInOrderFailure expected) {
}
}
@Test(expected = WantedButNotInvoked.class)
public void should_fail_when_checking_order_of_interactions_that_did_not_happen() {
then(mock).should(inOrder(mock)).booleanObjectReturningMethod();
}
@Test
public void should_pass_fluent_bdd_scenario() {
Bike bike = new Bike();
Person person = mock(Person.class);
Police police = mock(Police.class);
person.ride(bike);
person.ride(bike);
then(person).should(times(2)).ride(bike);
then(police).shouldHaveZeroInteractions();
}
@Test
public void should_pass_fluent_bdd_scenario_with_ordered_verification() {
Bike bike = new Bike();
Car car = new Car();
Person person = mock(Person.class);
person.drive(car);
person.ride(bike);
person.ride(bike);
InOrder inOrder = inOrder(person);
then(person).should(inOrder).drive(car);
then(person).should(inOrder, times(2)).ride(bike);
}
@Test
public void should_pass_fluent_bdd_scenario_with_ordered_verification_for_two_mocks() {
Car car = new Car();
Person person = mock(Person.class);
Police police = mock(Police.class);
person.drive(car);
person.drive(car);
police.chase(car);
InOrder inOrder = inOrder(person, police);
then(person).should(inOrder, times(2)).drive(car);
then(police).should(inOrder).chase(car);
}
static class Person {
void ride(Bike bike) {
}
void drive(Car car) {
}
}
static class Bike {
}
static class Car {
}
static class Police {
void chase(Car car) {
}
}
class Dog {
public String bark() {
return "woof";
}
}
private class SomethingWasWrong extends RuntimeException {
}
private class AnotherThingWasWrong extends RuntimeException {
}
}