首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对Maven多模块Spring应用程序进行单元测试?

如何对Maven多模块Spring应用程序进行单元测试?
EN

Stack Overflow用户
提问于 2013-10-28 04:55:04
回答 2查看 3.2K关注 0票数 3

我在尝试用Spring测试maven多模块项目时遇到了问题。

我有四个模块:

代码语言:javascript
复制
application-core
application-data
application-service
application-web

这是我的测试,它在application-core模块中:

代码语言:javascript
复制
@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);
    }

}

以下是实施情况:

代码语言:javascript
复制
@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;
    }
}

接口:

代码语言:javascript
复制
public interface ITicketDAO {
    ITicket getTicket(Long ticketNumber);
}

ITicketDAO its在application-data模块上的实现

代码语言:javascript
复制
@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并不关心将“其他模块”放入类路径。

Spring抛出BeanCreationException的原因很明显。

我说的对吗?

所以我想在不妨碍Spring测试的情况下测试我的项目。

我怎么做才能让我的测试有任何问题?

我在测试文件夹/包中创建了虚拟类,它可以工作,但是.

我最终会在我的application-core模块的测试文件夹中获得所有外部实现。

还有更好的方法吗?

提前谢谢。

更新:

代码语言:javascript
复制
application-data
application-service
application-web

它们都依赖于application-core。Spring成功地注入了TicketCore(application-core)。我想要的是给Spring“一些东西”(一个虚拟类)注入ITicketDAO,只为了运行测试。

代码语言:javascript
复制
<beans>
    <context:component-scan base-package="ve.gov.imat.transimat" />
    <context:annotation-config />

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

回答 2

Stack Overflow用户

发布于 2013-10-28 05:04:55

假设每个Maven模块都是一个完全独立的项目。对每个模块的代码进行具体的测试,并在模块中添加集成测试,在模块中包含运行它们所需的所有依赖项。

您还没有提供关于模块之间的依赖关系的任何信息,但是您遇到的问题似乎是您需要为测试目的实现一些接口,但是您的生产bean是在另一个模块中定义的。这就是模拟框架(如EasyMock和Mockito )的目的;它们允许您编写简单的占位符实现,以便能够具体地测试TicketCore,即使在真正的实现可用时使用它们也是一个好主意,这样您就可以确保一次只测试一个组件。

TicketTest中,您正确地为ITicketDAO定义了Mockito模拟,但是您的TicketCore仍然试图从Spring自动获取bean,尽管您还没有注册它。可以手动将bean注册到测试上下文中,也可以将模拟的定义放在@Configuration中的src/test中。

票数 3
EN

Stack Overflow用户

发布于 2013-10-28 08:19:01

如果我很了解您,那么您的问题是上下文文件引用--测试类路径中没有可用的类。

原则上,测试不应该需要任何协作者的实现才能工作,只需要一个sut。

一种解决方案是在测试/资源文件夹下创建一个应用程序- test -context.xml文件,用于测试,而不是生产。在此文件中,您可以创建协作者的模拟。

代码语言:javascript
复制
<!-- Mock service for splitting jobs -->
<bean factory-bean="mockControl" factory-method="createMock"
    primary="true">
    <constructor-arg value="net.compart.docpilot.model.service.JobSplitService" />
</bean>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19627398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档