jmockit似乎找不到我的非严格期望,生成的结果为null

时间:2014-05-14 21:44:21

标签: java spring jmockit

我正在尝试在某些遗留代码中测试“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

2 个答案:

答案 0 :(得分:1)

JMockit中还有一种方法可以帮助您解决问题:

Deencapsulation's setField

这样你就可以告诉JMockit原始类中的null属性应该被测试类中的mocked对象替换。我已经像你一样经历过类似的错误,这对我有帮助。

同样,还有方法getField,它可以帮助您在测试期间获取类的当前私有属性的值。

答案 1 :(得分:0)

  • 遗留代码有两个相同的方法,命名略有不同。当Rogerio注意到我记录的期望与我测试的不同时,我开始意识到这一点。
  • 我的JMockit用法正确无误。