package org.dayatang.domain;
import org.dayatang.domain.ioc.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class InstanceFactoryTest {
private InstanceProvider instanceProvider;
private MyService1 service1 = new MyService1();
private MyService2 service2 = new MyService2();
private MyService3 service3 = new MyService3();
@Before
public void setUp() throws Exception {
instanceProvider = mock(InstanceProvider.class);
InstanceFactory.setInstanceProvider(instanceProvider);
}
@After
public void tearDown() throws Exception {
InstanceFactory.setInstanceProvider(null);
InstanceFactory.clear();
}
/**
* 设置了InstanceProvider,并且可通过InstanceProvider找到Bean
*/
@Test
public void testGetInstanceByInstanceProvider() {
InstanceFactory.setInstanceProvider(instanceProvider);
when(instanceProvider.getInstance(Service.class)).thenReturn(service1);
when(instanceProvider.getInstance(Service.class, "service2")).thenReturn(service2);
when(instanceProvider.getInstance(Service.class, TheAnnotation.class)).thenReturn(service3);
assertEquals(service1, InstanceFactory.getInstance(Service.class));
assertEquals(service2, InstanceFactory.getInstance(Service.class, "service2"));
assertEquals(service3, InstanceFactory.getInstance(Service.class, TheAnnotation.class));
}
/**
* 设置了InstanceProvider,并且可通过InstanceProvider找到Bean
*/
@Test
public void testGetInstanceByServiceLoaderWithoutInstanceProvider() {
assertNotNull(InstanceFactory.getInstance(Service2.class));
assertEquals(service2, InstanceFactory.getInstance(Service.class, "service2"));
assertEquals(service3, InstanceFactory.getInstance(Service.class, TheAnnotation.class));
}
/**
* 设置了InstanceProvider,并且可通过InstanceProvider找到Bean
*/
@Test
public void testGetInstanceByServiceLoaderWithInstanceProvider() {
InstanceFactory.setInstanceProvider(instanceProvider);
when(instanceProvider.getInstance(Service.class)).thenReturn(null);
when(instanceProvider.getInstance(Service.class, "service2")).thenReturn(null);
when(instanceProvider.getInstance(Service.class, TheAnnotation.class)).thenReturn(null);
assertNotNull(InstanceFactory.getInstance(Service2.class));
assertEquals(service2, InstanceFactory.getInstance(Service.class, "service2"));
assertEquals(service3, InstanceFactory.getInstance(Service.class, TheAnnotation.class));
}
/**
* 通过Bind方法注册的Bean
*/
@Test
public void testGetInstanceByBinder() {
MyService21 service21 = new MyService21();
MyService22 service22 = new MyService22();
MyService23 service23 = new MyService23();
InstanceFactory.bind(Service2.class, service21);
assertNotNull(InstanceFactory.getInstance(Service2.class));
InstanceFactory.bind(Service2.class, service22, "service2");
InstanceFactory.bind(Service2.class, service23, "service3");
InstanceFactory.bind(Service2.class, service23, TheAnnotation.class);
assertEquals(service22, InstanceFactory.getInstance(Service2.class, "service2"));
assertEquals(service23, InstanceFactory.getInstance(Service2.class, "service3"));
assertEquals(service23, InstanceFactory.getInstance(Service2.class, TheAnnotation.class));
}
@Test(expected = IocInstanceNotFoundException.class)
public void testNotFound() {
InstanceFactory.getInstance(Long.class);
}
}