2013-10-28 73 views
3

我在嘗試使用Spring對Maven多模塊項目進行單元測試時遇到了問題。如何對Maven多模塊Spring應用程序進行單元測試?

我有4個模塊:

application-core 
application-data 
application-service 
application-web 

這是我的測試,其application-core模塊:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:/config/application-context.xml") 
public class TicketTest { 

    @Mock 
    ITicketDAO ticketDAO; 

    @Autowired 
    @InjectMocks 
    ITicketCore ticketCore; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testRegisterTicket_Ticket_NotUsed_isValid() { 
     Long ticketNumber = 0L; 
     when(ticketDAO.getTicket(anyLong())).thenReturn(null); 
     final boolean isValidTicket = ticketCore.validateTicket(ticketNumber); 
     assertTrue(isValidTicket); 
    } 

} 

這裏是實現:

@Component 
@Scope("prototype") 
public class TicketCore implements ITicketCore{ 
    private ITicketDAO ticketDao; 

    @Autowired 
    public TicketCore(ITicketDAO ticketDao) { 
     this.ticketDao = ticketDao; 
    } 

    @Override 
    public boolean validateTicket(Long ticketNumber) { 
     ITicket ticket = ticketDao.getTicket(ticketNumber); 
     return ticket != null; 
    } 
} 

接口:

ITicketDAO其​​模塊

實現:

@Service 
public class TicketDAO implements ITicketDAO { 
    @Override 
    public ITicket getTicket(Long ticketNumber) { 
     return null; //To change body of implemented methods use File | Settings | File Templates. 
    } 
} 

我有問題,測試這個代碼,因爲上下文沒有找到的ITicketDAO實施。這似乎很明顯,因爲在測試運行時,JUnit不關心在類路徑中放入「其他模塊」。

由於顯而易見的原因,彈簧投擲BeanCreationException

我說得對不對?

所以我想測試我的項目,沒有春季進入測試的方式。

我該怎麼做才能讓我的測試運行沒有任何問題?

我創建虛擬類在test文件夾/包,和它的作品,但...

我最終會在我的application-core模塊的測試文件夾中所有的外部實現。

還有更好的辦法嗎?

在此先感謝。

UPDATE:

application-data 
application-service 
application-web 

他們都依賴於application-core。春季成功注入TicketCoreapplication-core)。我想要的是給彈簧「一些東西」(一個虛擬的類)注入ITicketDAO只是爲了運行測試。

<beans> 
    <context:component-scan base-package="ve.gov.imat.transimat" /> 
    <context:annotation-config /> 

    <aop:config proxy-target-class="true" /> 
</beans> 

回答

3

假設每個Maven模塊是一個完全獨立的項目。將特定於每個模塊代碼的測試放入其中,並在模塊中添加集成測試,其中包含運行它們所需的所有依賴關係。

您還沒有提供任何有關模塊之間依賴關係的信息,但似乎您遇到的問題是您需要某些接口的實現來進行測試,但您的生產bean是在另一個接口中定義的模塊。這就是EasyMock和Mockito這樣的模擬框架。它們允許您編寫簡單的佔位符實現,以便您可以專門測試TicketCore,即使在真正的實現可用時也可以使用它們,這樣您就可以確保一次只測試一個組件。

TicketTest中,您正確定義了您的Mockito模擬ITicketDAO,但您的TicketCore仍然嘗試從Spring自動獲取bean,即使您尚未註冊它。可以手動將bean註冊到測試環境中,也可以將模型的定義放在@Configurationsrc/test中。

+0

能給我這個部分的一個例子「無論是手動你的bean註冊到測試環境或地方的模擬定義在SRC的@Configuration /測試。「,請。這意味着我需要對「ITicketDAO」進行「虛擬類」實現?我也更新了這個問題。 –

0

如果我已經很好地理解了你的問題,那麼你的上下文文件引用了你在測試類路徑中沒有的類。

原則上測試不應該需要執行任何協作者的工作,只有其中的一個。

一個解決方案是在測試/資源文件夾下創建一個application-test-context.xml文件,以用於測試而不是生產測試。在該文件中,你可以創建你的合作者的嘲笑

<!-- Mock service for splitting jobs --> 
<bean factory-bean="mockControl" factory-method="createMock" 
    primary="true"> 
    <constructor-arg value="net.compart.docpilot.model.service.JobSplitService" /> 
</bean> 
相關問題