每個mock對象都需要手工創建麼?答案當然是否定的我們有FactoryBean通過在配置文件中指定bean的定義讓spring來替我們創建mock對象如下是針對Foo類的定義
<bean id=mockFoo class=orgeasymockEasyMock factorymethod=createMock>
<constructorarg index= value=Foo/>
</bean>
< /constructorarg>與此同時Spring TestContext框架提供了 @ContextConfiguration annotation 允許開發人員手工指定 Spring 配置文件所在的位置這樣開發過程中如果開發人員遵循比較好的配置文件組織結構可以維護一套只用於測試的對象關系配置裡面只維護測試用到的 mock 對象以及測試中用到的對 mock 對象有依賴關系的對象在產品代碼中則使用另一套配置文件配置真實的業務對象
JUnit 之後Test 類上可以通過 @RunWith 注解指定測試用例的 TestRunner Spring TestContext框架提供了擴展於 orgjunitinternalrunnersJUnitClassRunner 的 SpringJUnitClassRunner它負責總裝 Spring TestContext 測試框架並將其統一到 JUnit 框架中這樣你可以把 Test 類上的關於 Spring Test 類的繼承關系去掉並且使用 JUnit 之後引入的 annotation 去掉其他任何 JUnit 需要的約定和方法繼承讓 Test 類更加 POJO
Test 類也是純正 的 java 對象自然也可以通過 Spring 來管理依賴關系在 Test 類的成員變量上加上 @Autowired 聲明使用 SpringJUnitClassRunner 運行 Test CaseSpring 會很聰明地幫助我們擺平 Test 依賴的對象然後再運行已經合法的 Test Case只要你在用於測試的配置文件裡面定義了完整的依賴關系一如其他正常對象
<bean id=
Helloword
class=
Helloworld
autowire=
byType
/>
這樣經過上面三點變化例子代碼變成了這樣
import static orgeasymockEasyMock*;
@RunWith(SpringJUnitClassRunnerclass)
@ContextConfiguration(testcontextxml)
public void HelloworldTest {
@Autowired
private Foo foo;
@Autowired
private Bar bar;
@Autowired
private Helloworld helloworld;
@Before
public void before() {
reset(foo bar);
}
@After
public void after() {
verify(foo bar);
}
@Test
public void shouldSayHello() {
//set expectations about foo/bar
replay(foo bar);
helloworldsayHello();
//assert verification
}
//
}
[] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29007.html