2016-03-07 80 views
1

我找不到爲什麼以下簡單的情況是失敗的:我有一個Spring應用程序,其中加載了一個Spring bean從應用程序上下文:Spring Test + Mockito.mock - Spring失敗,因爲它試圖加載模擬bean @Autowired依賴關係

public class MyFilter implements Filter{ 

    private IPermissionService permissionService; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     WebApplicationContext ac = null; 
     try{ 
      ac = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext()); 
      permissionService = ac.getBean(PermissionServiceImpl.class); 

PermissionServiceImpl有@Autowired屬性DataSource,這樣在我的TestNG的測試,我嘲笑它在Spring的ApplicationContext:

@Configuration 
public class MyFilterSpringTestConfig{ 

    @Bean 
    public IPermissionService permissionService(){ 
     return Mockito.mock(PermissionServiceImpl.class); 
    } 

MyTest的:

@Test 
@WebAppConfiguration 
@ContextConfiguration(classes=MyFilterSpringTestConfig.class) 
public class MyFilterSpringTest extends BaseSpringFilterTest{ 

    ... 

問題是,在Spring初始化時,我得到一個異常,抱怨PermissionServiceImpl的dataSource依賴不滿足。因爲我用模擬包裝它,爲什麼它仍然失敗?我怎麼修復它?

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=myDataSource)} 
+0

不要模擬該類,嘲笑界面。如果你創建了一個類的模擬,它仍然是該類的一個實例,包含所有的變量和註釋,而這些變量和註釋依然被掃描。所以你應該嘲笑接口(也可以編程接口,而不是像現在這樣做的具體類)。 –

+0

你是對嘲笑界面。但是在這種情況下會有兩個過濾器:PermissionServiceImpl的Filter1和PermissionServiceImpl2的Filter2。開發人員必須在web.xml中定義他們喜歡的過濾器,並根據過濾器爲PermissionServiceImpl或PermissionServiceImpl2導入匹配的彈簧上下文。使用'permissionService = ac.getBean(PermissionServiceImpl.class);'在過濾器中有助於確保它們沒有導入錯誤的xml – codependent

+0

那麼接口的用途是什麼......使用配置文件或其他連線方式或創建2個接口,爲什麼你需要2個相同接口和2個過濾器的實現?使用該設置首先看起來有點不妥。感覺就像你在試圖建立一些東西,你不應該在第一個地方做... –

回答

2

當使用Mockito(或任何其他模擬框架)嘲笑類時,該類仍然是原始類的實例。隨之而來的是它也包含了所有的註釋和類信息。

所以當你創建一個類的模擬它仍然檢測到它的所有註釋並試圖完全填充它。即@Autowire其他實例。

要麼不使用自動佈線,要麼不模擬類,而是模擬接口(不包含該信息)。

相關問題