2011-10-19 24 views
1

鑑於這種類:注入inplaced的自動裝配Autowired bean的單元測試存根服務

public SomeClass implements SomeInterface { 

     @Autowired private RemoteService rService; 

} 

並給予這個單元測試:

public SomeClassTest { 

... 
SomeClass sc = (SomeClass) ctx.getbean("someService"); 
.. 
} 

我想存根「rService」與其他一些目的。我不想修改SomeInterface方法來公開任何getter/setter,因爲'rService'只適用於一個實現。

+1

如果你想有一個適當的完整的ApplicationContext ,你所做的並不是真正的單元測試,而是一個集成測試 –

回答

3

除了僅僅通過setter注入測試中的復位RemoteService模擬/存根:

someClass.setRemoteService(remoteServiceMock); 

(如果上述方法不爲你工作,出於某種原因...)=>您可以創建一個「測試-config.xml文件」,在那裏你會重新定義的唯一bean是remoteService用相同的(真正)bean的名字,但有一個存根實現,因此它可以覆蓋真正豆:

<bean id="remoteService" class="org.your.package.remote.RemoteServiceStub"/> 

其中RemoteServiceStub將擴大RemoteService,所以它可以按類型被裝配到SomeClass

然後在您的測試中,注入SomeClass的,你通常會做:

@ContextConfiguration(locations = { "classpath:/path/to/test-config.xml" }) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class MyBeanTest { 

    @Autowired 
    private SomeClass someClass; 

    @Test 
    public void someClassShouldBehave() { 
     ... 
    } 
} 
1

將setter添加到實現類(SomeClass),並手動調用setter。這就是依賴注入的要點,以及具有實現和接口的優點:您可以向實現添加方法,這些方法將不會通過接口提供。

你不應該爲一個類的單元測試使用Spring上下文。

順便說一下,getBean方法可能會返回代理到您的類,而不是SomeClass實例。

SomeClass sc = new SomeClass(); 
sc.setRemoteService(mockRemoteService); 
// test any method of sc. 
+0

+1 - 如果你需要混淆Spring上下文,那麼你就在Integration-land中。這很好,@tolitius有你的解決方案。如果添加setter會冒犯你,只需刪除'private'關鍵字以使你的'RemoteService'字段包可見。 – millhouse

相關問題