package org.needle4j.mock;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.needle4j.junit.NeedleBuilders.needleRule;
import java.lang.reflect.Field;
import javax.inject.Inject;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Spy;
import org.needle4j.annotation.InjectInto;
import org.needle4j.annotation.ObjectUnderTest;
import org.needle4j.junit.NeedleRule;
public class SpyProviderTest {
public static interface B {
String getName();
}
public static class BImpl implements B {
@Override
public String getName() {
return "foo";
}
}
public static class A {
@Inject
private B b;
public String hello() {
return "hello " + b.getName();
}
}
public static class C {
public String getName() {
return "c";
}
}
@Rule
public final NeedleRule needle = needleRule("needle-mockito").build();
@ObjectUnderTest
@Spy
private A a;
@ObjectUnderTest(implementation = BImpl.class)
@InjectInto(targetComponentId = "a")
@Spy
private B b;
@Test
public void shouldInjectSpyForA() {
when(b.getName()).thenReturn("world");
assertThat(a.hello(), is("hello world"));
verify(a).hello();
verify(b).getName();
}
@Test
public void shouldNotRequestSpyWhenAnnotationIsNull() throws Exception {
Field field = SpyProviderTest.class.getDeclaredField("b");
assertFalse(SpyProvider.FAKE.isSpyRequested(field));
}
}