java-如何对Maven多模块Spring应用程序进行单元测试?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何对Maven多模块Spring应用程序进行单元测试?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2763字,纯文字阅读大概需要4分钟。
内容图文
![java-如何对Maven多模块Spring应用程序进行单元测试?](/upload/InfoBanner/zyjiaocheng/659/40514bb74c574fa789acc478c86f27b7.jpg)
我在尝试使用Spring进行Maven多模块项目的单元测试时遇到问题.
我有4个模块:
application-core
application-data
application-service
application-web
这是我的测试,它在应用程序核心模块中:
@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;
}
}
接口:
public interface ITicketDAO {
ITicket getTicket(Long ticketNumber);
}
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并不关心将“其他模块”放入类路径中.
出于明显的原因,Spring抛出了BeanCreationException.
我对吗?
因此,我想在不妨碍Spring进行测试的情况下测试我的项目.
我该怎么办才能使我的测试无任何问题???
我已经在测试文件夹/程序包中创建了虚拟类,并且可以正常工作,但是…
最终,我将在应用程序核心模块的测试文件夹中拥有所有外部实现.
有一个更好的方法?
提前致谢.
更新:
application-data
application-service
application-web
所有这些都取决于应用程序核心. Spring成功注入了TicketCore(application-core).我想要给Spring提供一些“东西”(虚拟类)以注入ITicketDAO来运行测试.
<beans>
<context:component-scan base-package="ve.gov.imat.transimat" />
<context:annotation-config />
<aop:config proxy-target-class="true" />
</beans>
解决方法:
假设每个Maven模块都是一个完全独立的项目.将特定于每个模块代码的测试放入其中,并在其中已包含运行它们所需的所有依赖项的模块中添加集成测试.
您尚未提供有关模块之间的依赖关系的任何信息,但看来您遇到的问题是您需要某种接口实现以进行测试,但是生产Bean是在另一个模块中定义的.这就是EasyMock和Mockito之类的模拟框架的作用;它们使您可以编写简单的占位符实现,以便可以特定地测试TicketCore,即使在实际实现可用的情况下,也要使用它们,这是个好主意,这样可以确保您一次只测试一个组件.
在TicketTest中,您已经正确地为ITicketDAO定义了Mockito模拟,但是即使您尚未注册,TicketCore仍试图从Spring自动获取Bean.手动将bean注册到测试上下文中,或将模拟的定义放在src / test中的@Configuration中.
内容总结
以上是互联网集市为您收集整理的java-如何对Maven多模块Spring应用程序进行单元测试?全部内容,希望文章能够帮你解决java-如何对Maven多模块Spring应用程序进行单元测试?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。