- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在尝试使用 Spring 对 Maven 多模块项目进行单元测试时遇到问题。
我有 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;
}
}
接口(interface):
public interface ITicketDAO {
ITicket getTicket(Long ticketNumber);
}
ITicketDAO
在 application-data
模块上的实现:
@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
模块的测试文件夹中拥有所有外部实现。
有更好的方法吗?
提前致谢。
更新:
application-data
application-service
application-web
它们都依赖于application-core
。 Spring成功注入(inject)TicketCore
(application-core
)。我想要的是给 Spring “一些东西”(一个虚拟类)注入(inject) ITicketDAO
只是为了运行测试。
<beans>
<context:component-scan base-package="ve.gov.imat.transimat" />
<context:annotation-config />
<aop:config proxy-target-class="true" />
</beans>
最佳答案
假设每个 Maven 模块都是一个完全独立的项目。专门针对每个模块的代码进行测试,并在包含运行它们所需的所有依赖项的模块中添加集成测试。
您没有提供有关模块之间依赖关系的任何信息,但您遇到的问题似乎是您需要某种接口(interface)实现以用于测试目的,但您的生产 bean 是在另一个模块中定义的.这就是像 EasyMock 和 Mockito 这样的模拟框架的用途;它们允许您编写简单的占位符实现,以便您可以专门测试 TicketCore
,即使在真正的实现可用时使用它们也是一个好主意,这样您就可以确定您只是在测试一个一个组件。
在 TicketTest
中,您正确地为 ITicketDAO
定义了 Mockito 模拟,但您的 TicketCore
仍在尝试从 Spring 自动获取 bean ,即使您尚未注册。手动将您的 bean 注册到测试上下文中,或者将模拟的定义放在 src/test
中的 @Configuration
中。
关于java - 如何对 Maven 多模块 Spring 应用程序进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19627398/
我是一名优秀的程序员,十分优秀!