blob: df985ceec5a754afe247a7268aea98aa68022e51 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitousage.debugging;
import org.assertj.core.api.Assertions;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.internal.util.MockUtil;
import org.mockito.junit.MockitoJUnitRunner;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import static org.junit.Assert.fail;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.*;
/**
* Tests the verbose logging of invocation on mock methods.
*
* BEWARE: These tests rely on mocking the standard output. While in a
* single-threaded environment the Before/After-contract ensures, that the
* original output stream is restored, there is no guarantee for this
* in the parallel setting.
* Maybe, the test class should be @Ignore'd by default ...
*/
@RunWith(MockitoJUnitRunner.class)
public class VerboseLoggingOfInvocationsOnMockTest {
private ByteArrayOutputStream output;
private PrintStream original;
@Mock UnrelatedClass unrelatedMock;
@Before
public void setUp() {
original = System.out;
output = new ByteArrayOutputStream();
System.setOut(new PrintStream(output));
}
@After
public void tearDown() {
System.setOut(original);
}
@Test
public void shouldNotPrintInvocationOnMockWithoutSetting() {
// given
Foo foo = mock(Foo.class, withSettings().verboseLogging());
// when
foo.giveMeSomeString("Klipsch");
unrelatedMock.unrelatedMethod("Apple");
// then
Assertions.assertThat(printed())
.doesNotContain(mockName(unrelatedMock))
.doesNotContain("unrelatedMethod")
.doesNotContain("Apple");
}
@Test
public void shouldPrintUnstubbedInvocationOnMockToStdOut() {
// given
Foo foo = mock(Foo.class, withSettings().verboseLogging());
// when
foo.doSomething("Klipsch");
// then
Assertions.assertThat(printed())
.contains(getClass().getName())
.contains(mockName(foo))
.contains("doSomething")
.contains("Klipsch");
}
@Test
public void shouldPrintStubbedInvocationOnMockToStdOut() {
// given
Foo foo = mock(Foo.class, withSettings().verboseLogging());
given(foo.giveMeSomeString("Klipsch")).willReturn("earbuds");
// when
foo.giveMeSomeString("Klipsch");
// then
Assertions.assertThat(printed())
.contains(getClass().getName())
.contains(mockName(foo))
.contains("giveMeSomeString")
.contains("Klipsch")
.contains("earbuds");
}
@Test
public void shouldPrintThrowingInvocationOnMockToStdOut() {
// given
Foo foo = mock(Foo.class, withSettings().verboseLogging());
doThrow(new ThirdPartyException()).when(foo).doSomething("Klipsch");
try {
// when
foo.doSomething("Klipsch");
fail("Exception excepted.");
} catch (ThirdPartyException e) {
// then
Assertions.assertThat(printed())
.contains(getClass().getName())
.contains(mockName(foo))
.contains("doSomething")
.contains("Klipsch")
.contains(ThirdPartyException.class.getName());
}
}
@Test
public void shouldPrintRealInvocationOnSpyToStdOut() {
// given
FooImpl fooSpy = mock(FooImpl.class,
withSettings().spiedInstance(new FooImpl()).verboseLogging());
doCallRealMethod().when(fooSpy).doSomething("Klipsch");
// when
fooSpy.doSomething("Klipsch");
// then
Assertions.assertThat(printed())
.contains(getClass().getName())
.contains(mockName(fooSpy))
.contains("doSomething")
.contains("Klipsch");
}
@Test
public void usage() {
// given
Foo foo = mock(Foo.class, withSettings().verboseLogging());
given(foo.giveMeSomeString("Apple")).willReturn(
"earbuds");
// when
foo.giveMeSomeString("Shure");
foo.giveMeSomeString("Apple");
foo.doSomething("Klipsch");
}
private String printed() {
return output.toString();
}
private String mockName(Object mock) {
return MockUtil.getMockName(mock).toString();
}
private static class UnrelatedClass {
void unrelatedMethod(String anotherStringValue) {
}
}
/**
* An exception that isn't defined by Mockito or the JDK and therefore does
* not appear in the logging result by chance alone.
*/
static class ThirdPartyException extends RuntimeException {
private static final long serialVersionUID = 2160445705646210847L;
}
static class FooImpl implements Foo {
public String giveMeSomeString(String param) {
return null;
}
public void doSomething(String param) {
}
}
}