我正在尝试在某些遗留代码中测试“provisionProduct()”方法。正如你所看到的,它最终会调用productDAO,我想嘲笑它。
@Service( "productService" )
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ProductServiceImpl implements IProductService
{
private ProductDAO productDAO;
@Autowired
public ProductServiceImpl(ProductDAO dao)
{
productDAO = dao;
}
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public ProductProvisionResponseDTO provisionProduct(Long productId, String serverName) throws PortalException
{
[...]
try
{
Product product = productDAO.findProductById(productId);
[...]
}
}
这是我的测试:
public class ProductServiceTest
{
@Mocked
private ProductDAO m_mockProductDAO;
private IProductService m_productService;
@Test
public void provisionProduct_noProfileAssociatedToProduct_throwsPortalException() throws PortalException, DAOException
{
m_productService = new ProductServiceImpl( m_mockProductDAO );
new NonStrictExpectations()
{
{
m_mockProductDAO.findByProductId( anyLong );
result = new Product();
}
};
m_productService.provisionProduct( 123456789L, "don't care" );
}
}
当我运行测试时,对productDAO的调用总是返回null。
FWIW我可以进入findProductById()方法,它将我带入JMockit的RecordAndReplayExecution类。当JMockit到达handleInvocation()时,nonStrictExpectation为null,后来produceResult()给出null。
我相信这是一个简单的测试用例,但我不确定Spring是否会以某种方式造成不良影响,这就是我在代码片段中留下各种注释的原因。不可否认,我对Spring的运作方式并不十分熟悉。我直接实例化了ProductServiceImpl,所以我不相信Spring会在那里发挥作用。
有什么想法吗?我错过了一些完全明显的东西吗?
JMockit v1.8,JUnit v4.8.2
答案 0 :(得分:1)
JMockit
中还有一种方法可以帮助您解决问题:
这样你就可以告诉JMockit原始类中的null属性应该被测试类中的mocked对象替换。我已经像你一样经历过类似的错误,这对我有帮助。
同样,还有方法getField
,它可以帮助您在测试期间获取类的当前私有属性的值。
答案 1 :(得分:0)