2011-07-31 68 views
0

我试图嘲笑与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(); 
} 

当DAO对象是在预期块使用的,NPE是抛出。我试着将dao的声明移动到用@Mocked注释的成员变量,但同样的事情发生。我也尝试过使用MyDao的具体实现,并且发生同样的事情。

+0

你用春天吗? – iddqd

+0

不,这个类目前没有使用Spring,但将来可能会用于将Dao注入到ClassUsingDao中。 – Brian

回答

2

这不是dao这是空的,但是any。从Integer(在你的转换之后)拆解为int需要一个解引用,这会引发一个NullPointerException异常。请尝试使用anyInt

我不认为jMockit文档谈到Expectations.any的实际值是什么,但请注意,它可以成功转换为任何其他类型(可以说(String)any(Integer)any)。在Java中,所有演员总能成功的唯一值是null。所以,Expectations.any必须为空。一个惊喜,但真的不可避免。

+0

果然,就是这样。感谢您的帮助 - 我花了好几个小时来移动它,这正好在我面前。谢谢! – Brian