模拟接口为空

时间:2011-07-31 16:39:20

标签: java nullpointerexception unboxing jmockit

我正在尝试用JMockit模拟DAO:

public interface MyDao {
    Details getDetailsById(int id);
}

使用此测试类:

public class TestClass {

    @Test
    public void testStuff(final MyDao dao) throws Exception
    {
        new Expectations()
        {
            {
                // when we try to get the message details, return our sample
                // details
                dao.getDetailsById((Integer) any);  ***THROWS AN NPE
                result = sampleDetails;
            }
        };

        ClassUsingDao daoUser = new ClassUsingDao(dao);
        // calls dao.getDetailsById()
        daoUser.doStuff();
}

在Expectations块中使用dao对象时,会抛出NPE。我已经尝试将dao的声明移动到用@Mocked注释的成员变量,但同样的事情发生了。我也尝试过使用MyDao的具体实现,同样的事情发生了。

1 个答案:

答案 0 :(得分:2)

dao不是any,而是anyInt。从Integer(在您的强制转换之后)到int的拆箱涉及取消引用,它会抛出NullPointerException。请尝试使用(String)any

我认为jMockit文档没有说明Expectations.any的实际值是什么,但请注意,它可以成功地转换为任何其他类型(您可以说(Integer)any和{{1 }})。所有强制转换始终成功的Java中唯一的值是null。所以,Expectations.any必须为null。有点意外,但不可避免。