mirror of
https://github.com/google/guice.git
synced 2024-04-21 12:32:36 +00:00
git-svn-id: https://google-guice.googlecode.com/svn/trunk@1323 d779f126-a31b-0410-b53b-1d3aecad763e
197 lines
5.4 KiB
Java
197 lines
5.4 KiB
Java
package com.google.inject;
|
|
|
|
import static com.google.inject.Asserts.assertContains;
|
|
|
|
import com.google.inject.internal.util.Nullable;
|
|
|
|
import junit.framework.TestCase;
|
|
|
|
/**
|
|
* @author jessewilson@google.com (Jesse Wilson)
|
|
*/
|
|
public class NullableInjectionPointTest extends TestCase {
|
|
|
|
public void testInjectNullIntoNotNullableConstructor() {
|
|
try {
|
|
createInjector().getInstance(FooConstructor.class);
|
|
fail("Injecting null should fail with an error");
|
|
}
|
|
catch (ProvisionException expected) {
|
|
assertContains(expected.getMessage(),
|
|
"null returned by binding at " + getClass().getName(),
|
|
"parameter 0 of " + FooConstructor.class.getName() + ".<init>() is not @Nullable");
|
|
}
|
|
}
|
|
|
|
public void testInjectNullIntoNotNullableMethod() {
|
|
try {
|
|
createInjector().getInstance(FooMethod.class);
|
|
fail("Injecting null should fail with an error");
|
|
}
|
|
catch (ProvisionException expected) {
|
|
assertContains(expected.getMessage(),
|
|
"null returned by binding at " + getClass().getName(),
|
|
"parameter 0 of " + FooMethod.class.getName() + ".setFoo() is not @Nullable");
|
|
}
|
|
}
|
|
|
|
public void testInjectNullIntoNotNullableField() {
|
|
try {
|
|
createInjector().getInstance(FooField.class);
|
|
fail("Injecting null should fail with an error");
|
|
}
|
|
catch (ProvisionException expected) {
|
|
assertContains(expected.getMessage(),
|
|
"null returned by binding at " + getClass().getName(),
|
|
" but " + FooField.class.getName() + ".foo is not @Nullable");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Provider.getInstance() is allowed to return null via direct calls to
|
|
* getInstance().
|
|
*/
|
|
public void testGetInstanceOfNull() {
|
|
assertNull(createInjector().getInstance(Foo.class));
|
|
}
|
|
|
|
public void testInjectNullIntoNullableConstructor() {
|
|
NullableFooConstructor nfc
|
|
= createInjector().getInstance(NullableFooConstructor.class);
|
|
assertNull(nfc.foo);
|
|
}
|
|
|
|
public void testInjectNullIntoNullableMethod() {
|
|
NullableFooMethod nfm
|
|
= createInjector().getInstance(NullableFooMethod.class);
|
|
assertNull(nfm.foo);
|
|
}
|
|
|
|
public void testInjectNullIntoNullableField() {
|
|
NullableFooField nff
|
|
= createInjector().getInstance(NullableFooField.class);
|
|
assertNull(nff.foo);
|
|
}
|
|
|
|
private Injector createInjector() {
|
|
return Guice.createInjector(
|
|
new AbstractModule() {
|
|
protected void configure() {
|
|
bind(Foo.class).toProvider(new Provider<Foo>() {
|
|
public Foo get() {
|
|
return null;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* We haven't decided on what the desired behaviour of this test should be...
|
|
*/
|
|
public void testBindNullToInstance() {
|
|
try {
|
|
Guice.createInjector(new AbstractModule() {
|
|
protected void configure() {
|
|
bind(Foo.class).toInstance(null);
|
|
}
|
|
});
|
|
fail();
|
|
} catch (CreationException expected) {
|
|
assertContains(expected.getMessage(),
|
|
"Binding to null instances is not allowed.",
|
|
"at " + getClass().getName(), ".configure(NullableInjectionPointTest.java:");
|
|
}
|
|
}
|
|
|
|
public void testBindNullToProvider() {
|
|
Injector injector = Guice.createInjector(new AbstractModule() {
|
|
protected void configure() {
|
|
bind(Foo.class).toProvider(new Provider<Foo>() {
|
|
public Foo get() {
|
|
return null;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
assertNull(injector.getInstance(NullableFooField.class).foo);
|
|
|
|
try {
|
|
injector.getInstance(FooField.class);
|
|
}
|
|
catch(ProvisionException expected) {
|
|
assertContains(expected.getMessage(), "null returned by binding at");
|
|
}
|
|
}
|
|
|
|
public void testBindScopedNull() {
|
|
Injector injector = Guice.createInjector(new AbstractModule() {
|
|
protected void configure() {
|
|
bind(Foo.class).toProvider(new Provider<Foo>() {
|
|
public Foo get() {
|
|
return null;
|
|
}
|
|
}).in(Scopes.SINGLETON);
|
|
}
|
|
});
|
|
assertNull(injector.getInstance(NullableFooField.class).foo);
|
|
|
|
try {
|
|
injector.getInstance(FooField.class);
|
|
}
|
|
catch(ProvisionException expected) {
|
|
assertContains(expected.getMessage(), "null returned by binding at");
|
|
}
|
|
}
|
|
|
|
public void testBindNullAsEagerSingleton() {
|
|
Injector injector = Guice.createInjector(new AbstractModule() {
|
|
protected void configure() {
|
|
bind(Foo.class).toProvider(new Provider<Foo>() {
|
|
public Foo get() {
|
|
return null;
|
|
}
|
|
}).asEagerSingleton();
|
|
}
|
|
});
|
|
assertNull(injector.getInstance(NullableFooField.class).foo);
|
|
|
|
try {
|
|
injector.getInstance(FooField.class);
|
|
fail();
|
|
} catch(ProvisionException expected) {
|
|
assertContains(expected.getMessage(), "null returned by binding "
|
|
+ "at com.google.inject.NullableInjectionPointTest");
|
|
}
|
|
}
|
|
|
|
static class Foo { }
|
|
|
|
static class FooConstructor {
|
|
@Inject FooConstructor(Foo foo) { }
|
|
}
|
|
static class FooField {
|
|
@Inject Foo foo;
|
|
}
|
|
static class FooMethod {
|
|
@Inject
|
|
void setFoo(Foo foo) { }
|
|
}
|
|
|
|
static class NullableFooConstructor {
|
|
Foo foo;
|
|
@Inject NullableFooConstructor(@Nullable Foo foo) {
|
|
this.foo = foo;
|
|
}
|
|
}
|
|
static class NullableFooField {
|
|
@Inject @Nullable Foo foo;
|
|
}
|
|
static class NullableFooMethod {
|
|
Foo foo;
|
|
@Inject void setFoo(@Nullable Foo foo) {
|
|
this.foo = foo;
|
|
}
|
|
}
|
|
}
|