/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.andlib.service;
import java.lang.reflect.Field;
import android.test.AndroidTestCase;
public class DependencyInjectionTests extends AndroidTestCase {
public void testNoAutowire() {
DependencyInjectionService service = new DependencyInjectionService();
Object test = new Object();
service.inject(test);
}
public void testSimpleStringInjectionAutowire() {
DependencyInjectionService service = new DependencyInjectionService();
service.addInjector(
new AbstractDependencyInjector() {
@Override
public Object getInjection(Object object, Field field) {
if(field.getName().equals("foo"))
return "bar";
return null;
}
}
);
// test various permissions
Object test = new Object() {
@Autowired
public String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test);
assertEquals("bar", test.toString());
test = new Object() {
@Autowired
String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test);
assertEquals("bar", test.toString());
test = new Object() {
@Autowired
protected String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test);
assertEquals("bar", test.toString());
test = new Object() {
@Autowired
private String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test);
assertEquals("bar", test.toString());
// test no annotation
test = new Object() {
public String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test);
assertNull( test.toString());
}
public void testHierarchicalStringInjectionAutowire() {
DependencyInjectionService service = new DependencyInjectionService();
service.addInjector(
new AbstractDependencyInjector() {
@Override
public Object getInjection(Object object, Field field) {
return "malarkey";
}
}
);
service.addInjector(
new AbstractDependencyInjector() {
@Override
public Object getInjection(Object object, Field field) {
if(field.getName().equals("foo"))
return "bar";
return null;
}
});
Object test = new Object() {
@Autowired
public String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test);
assertEquals("bar", test.toString());
test = new Object() {
@Autowired
public String forks;
@Override
public String toString() {
return forks;
}
};
service.inject(test);
assertEquals("malarkey", test.toString());
}
public void testMissingInjection() {
DependencyInjectionService service = new DependencyInjectionService();
service.addInjector(
new AbstractDependencyInjector() {
@Override
public Object getInjection(Object object, Field field) {
if(field.getName().equals("wozzle"))
return "bar";
return null;
}
}
);
Object test = new Object() {
@Autowired
public String foo;
@Override
public String toString() {
return foo;
}
};
try {
service.inject(test);
fail("could inject with missing injector");
} catch (RuntimeException e) {
// expected
}
assertNull(test.toString());
}
public void testMultipleInjection() {
DependencyInjectionService service = new DependencyInjectionService();
service.addInjector(
new AbstractDependencyInjector() {
@Override
public Object getInjection(Object object, Field field) {
if(field.getName().equals("foo"))
return "bar";
return null;
}
}
);
Object test1 = new Object() {
@Autowired
public String foo;
@Override
public String toString() {
return foo;
}
};
Object test2 = new Object() {
@Autowired
public String foo;
@Override
public String toString() {
return foo;
}
};
service.inject(test1);
service.inject(test2);
assertEquals("bar", test1.toString());
assertEquals("bar", test2.toString());
}
public static class ParentInjectee {
@Autowired
protected String foo;
}
public static class ChildInjectee extends ParentInjectee {
@Autowired
protected String bar;
}
public void testInheritedInjection() {
DependencyInjectionService service = new DependencyInjectionService();
service.addInjector(
new AbstractDependencyInjector() {
@Override
public Object getInjection(Object object, Field field) {
if(field.getName().equals("foo"))
return "gotfoo";
else if(field.getName().equals("bar"))
return "hasbar";
return null;
}
}
);
ChildInjectee child = new ChildInjectee();
service.inject(child);
assertEquals("gotfoo", child.foo);
assertEquals("hasbar", child.bar);
}
}