2016-02-15 116 views
0

試圖從junit測試中調用一個非常簡單的方法。 我有一個接口和類:爲什麼這個DAO在spring中返回一個空指針

public interface CacheSampleDao { 
    String sample(String a); 
} 

public class CacheSampleImpl implements CacheSampleDao { 
    public String sample(String a) { 
     return "1"; 
    } 
} 

這個類也是我的context.xml

<bean class="com.premierinc.datascience.repo.CacheSampleImpl"/> 

豆和測試

@Test 
public class CacheSampleTest extends AbstractTest { 
    @Autowired CacheSampleDaoImpl cacheSampleDaoImpl; 
    @Test 
    public void cacheTest() { 
     String a = cacheSampleDaoImpl.sample("A"); 
    } 
} 

爲什麼這個測試是給一個空指針異常?是否還有一些其他配置相關,需要完成這個或我缺少的其他步驟?

+1

你的測試沒有任何註釋? –

+2

如何在測試中設置Spring上下文(我認爲@JérémieB的含義) - 「AbstractTest」中是否有任何'@ RunWith'註釋?如果沒有,你如何期待'cacheSampleDaoImpl'被注入? –

+0

CacheSampleTest有一個測試註釋,我在這裏做了一個編輯來顯示它。亞當,我沒有@RunWith註解,我現在正在研究那個 – swinters

回答

0

使用接口很好。 你有這個問題,是因爲你@Autowired的說法是:

@Autowired CacheSampleDaoImpl cacheSampleDaoImpl; 

但哪裏是你DaoImpl?您創建的Bean是一個CacheSampleImpl,它實現了CacheSampleDao接口,而不是DaoImpl。

此外,該屬性應根據您創建的bean進行命名,您沒有名爲cacheSampleDaoImpl的bean或類型爲CacheSampleDaoImpl的bean,以便自動連接成功解析。

基礎上(不包括在CacheSampleDaoImpl)我相信你想,這是什麼,你已經證明代碼:

@Autowired CacheSampleDao cacheSampleImpl; 

有關於如何做到這一點這裏好的帖子:

Spring autowire interface

+1

如果您閱讀了評論,您會發現問題比這更簡單。我懷疑名稱是剪切/粘貼到stackoverflow錯誤;-) –

+0

是的,這是一個剪切/粘貼問題,我的錯誤。 – swinters

0

對於使用彈簧進行集成測試,您應該關心如何在測試中插入彈簧環境,而在其他情況下,沒有任何關注構建和注入bean的事情,這些事情實際上發生在您的測試中。 作爲一個解決方案,您可以註解這個註解你的測試:@ContextConfiguration和@RunWith這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/your-spring-context.xml") 

您可以RAD更多關於春天指稱文檔測試在春季。

相關問題