解耦
高度耦合
public Knight(){
this.quest = new SomeQuest();
}
解耦
public Knight(Quest quest){
this.quest = quest;
}
使用Mock测试解耦
import static org.mockito.Mockito.*;
@Test
public void testMock(){
Quest mockQuest = mock(Quest.class);
Knight knightTest = new knight(mockQuest);
knightTest.embarkQuest();
verify(mockQuest,times(1)).embark();
}
注入
mock的对象也需要获得一个属性呢?
public class SomeQuest implements Quest{
private PrintStream stream;
public SomeQuest(PrintStream stream){
this.stream = stream;
}
public void embark(){
stream.print("it relay on a stream!")
}
}
通过XML配置构造器注入
<bean id="knight" class="org....*** Knight">
<constructor-arg ref="quest"/>
</bean>
<bean id="quest" class="org....*** Quest">
<constructor-arg value="#{T(System).out}"/>
</bean>
新特性–通过class文件配置config
import ...Knight;
import ...Quest;
import ...SomeQuest;
@Configuration
public class knightConfig{
@Bean
public Knight Knight(){
return new BraveKnight(quest());
}
@Bean
public Quest quest(){
return new SomeQuest(System.out);
}
}