下面列出了怎么用org.mockito.Spy的API类实例代码及写法,或者点击链接到github查看源代码。
private Set<Object> getOriTargetSet(){
Set<Object> oriTargetSet = new HashSet<>();
Set<Field> mockFields = new HashSet<Field>();
new InjectAnnotationScanner(ownerClazz, Spy.class).addTo(mockFields);
new InjectAnnotationScanner(ownerClazz, Mock.class).addTo(mockFields);
if(mockFields.size() == 0){
return new HashSet<>();
}
if(!isSpringContainer()){
return new HashSet<>();
}
for(Field field : mockFields){
Object oriTarget = getBean(field);
if(oriTarget == null){
continue;
}
oriTargetSet.add(oriTarget);
}
return oriTargetSet;
}
private Set<Object> instanceMocksIn(Object instance, Class<?> clazz) {
Set<Object> instanceMocks = new HashSet<Object>();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.isAnnotationPresent(Mock.class) || declaredField.isAnnotationPresent(Spy.class)) {
declaredField.setAccessible(true);
try {
Object fieldValue = declaredField.get(instance);
if (fieldValue != null) {
instanceMocks.add(fieldValue);
}
} catch (IllegalAccessException e) {
throw new MockitoException("Could not access field " + declaredField.getName());
}
}
}
return instanceMocks;
}
private Set<Object> instanceMocksIn(Object instance, Class<?> clazz) {
Set<Object> instanceMocks = new HashSet<Object>();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.isAnnotationPresent(Mock.class) || declaredField.isAnnotationPresent(Spy.class)) {
declaredField.setAccessible(true);
try {
Object fieldValue = declaredField.get(instance);
if (fieldValue != null) {
instanceMocks.add(fieldValue);
}
} catch (IllegalAccessException e) {
throw new MockitoException("Could not access field " + declaredField.getName());
}
}
}
return instanceMocks;
}
@SuppressWarnings({"deprecation", "unchecked"})
private Collection<Object> instanceMocksOf(Object instance) {
return Fields.allDeclaredFieldsOf(instance)
.filter(annotatedBy(Mock.class,
Spy.class,
MockitoAnnotations.Mock.class))
.notNull()
.assignedValues();
}
@Test
public void shouldFailIfTypeIsAnInterface() throws Exception {
class FailingSpy {
@Spy private List spyTypeIsInterface;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("an interface");
}
}
@Test
public void shouldReportWhenNoArgConstructor() throws Exception {
class FailingSpy {
@Spy
NoValidConstructor noValidConstructor;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("default constructor");
}
}
@Test
public void shouldReportWhenConstructorThrows() throws Exception {
class FailingSpy {
@Spy
ThrowingConstructor throwingConstructor;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("raised an exception");
}
}
@Test
public void shouldFailIfTypeIsAbstract() throws Exception {
class FailingSpy {
@Spy private AbstractList spyTypeIsAbstract;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("abstract class");
}
}
@Test
public void shouldFailIfTypeIsInnerClass() throws Exception {
class FailingSpy {
@Spy private TheInnerClass spyTypeIsInner;
class TheInnerClass { }
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (MockitoException e) {
Assertions.assertThat(e.getMessage()).contains("inner class");
}
}
@SuppressWarnings({"deprecation", "unchecked"})
private Collection<Object> instanceMocksOf(Object instance) {
return Fields.allDeclaredFieldsOf(instance)
.filter(annotatedBy(Mock.class,
Spy.class,
MockitoAnnotations.Mock.class))
.notNull()
.assignedValues();
}
@Override
protected boolean processInjection(Field field, Object fieldOwner, Set<Object> mockCandidates) {
FieldReader fieldReader = new FieldReader(fieldOwner, field);
// TODO refoctor : code duplicated in SpyAnnotationEngine
if(!fieldReader.isNull() && field.isAnnotationPresent(Spy.class)) {
try {
Object instance = fieldReader.read();
if (new MockUtil().isMock(instance)) {
// A. instance has been spied earlier
// B. protect against multiple use of MockitoAnnotations.initMocks()
Mockito.reset(instance);
} else {
new FieldSetter(fieldOwner, field).set(
Mockito.mock(instance.getClass(), withSettings()
.spiedInstance(instance)
.defaultAnswer(Mockito.CALLS_REAL_METHODS)
.name(field.getName()))
);
}
} catch (Exception e) {
throw new MockitoException("Problems initiating spied field " + field.getName(), e);
}
}
return false;
}
@Test
public void shouldFailIfTypeIsAnInterface() throws Exception {
class FailingSpy {
@Spy private List spyTypeIsInterface;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("an interface");
}
}
@Test
public void shouldReportWhenNoArgConstructor() throws Exception {
class FailingSpy {
@Spy
NoValidConstructor noValidConstructor;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("default constructor");
}
}
@Test
public void shouldReportWhenConstructorThrows() throws Exception {
class FailingSpy {
@Spy
ThrowingConstructor throwingConstructor;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("raised an exception");
}
}
@Test
public void shouldFailIfTypeIsAbstract() throws Exception {
class FailingSpy {
@Spy private AbstractList spyTypeIsAbstract;
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (Exception e) {
Assertions.assertThat(e.getMessage()).contains("abstract class");
}
}
@Test
public void shouldFailIfTypeIsInnerClass() throws Exception {
class FailingSpy {
@Spy private TheInnerClass spyTypeIsInner;
class TheInnerClass { }
}
try {
MockitoAnnotations.initMocks(new FailingSpy());
fail();
} catch (MockitoException e) {
Assertions.assertThat(e.getMessage()).contains("inner class");
}
}
@Test(expected=MockitoException.class)
public void shouldNotAllowMockAndSpy() throws Exception {
MockitoAnnotations.initMocks(new Object() {
@Mock @Spy List mock;
});
}
@Test(expected=MockitoException.class)
public void shouldNotAllowSpyAndInjectMock() throws Exception {
MockitoAnnotations.initMocks(new Object() {
@InjectMocks @Spy List mock;
});
}
@Test(expected=MockitoException.class)
public void shouldNotAllowCaptorAndSpy() throws Exception {
MockitoAnnotations.initMocks(new Object() {
@Spy @Captor ArgumentCaptor captor;
});
}
private boolean isAnnotatedByMockOrSpy(Field field) {
return null != field.getAnnotation(Spy.class)
|| null != field.getAnnotation(Mock.class)
|| null != field.getAnnotation(MockitoAnnotations.Mock.class);
}
@Test(expected=MockitoException.class)
public void shouldNotAllowMockAndSpy() throws Exception {
MockitoAnnotations.initMocks(new Object() {
@Mock @Spy List mock;
});
}
@Test(expected=MockitoException.class)
public void shouldNotAllowSpyAndInjectMock() throws Exception {
MockitoAnnotations.initMocks(new Object() {
@InjectMocks @Spy List mock;
});
}
@Test(expected=MockitoException.class)
public void shouldNotAllowCaptorAndSpy() throws Exception {
MockitoAnnotations.initMocks(new Object() {
@Spy @Captor ArgumentCaptor captor;
});
}