【问题标题】:Junit Mockito Mock SessionFactory into DAO Test classJunit Mockito 将 SessionFactory 模拟成 DAO 测试类
【发布时间】:2018-10-30 13:55:33
【问题描述】:

我是 JUnit 和 Mockito 的新手,我想在我的 DAO 测试类中模拟我的 SessionFactory,这就是我进行的方式:

@RunWith(MockitoJUnitRunner.class)
public class TodoDaoTest {
    @Mock 
    SessionFactory sessionFactory;

    @InjectMocks 
    TodoDao todoDao;

    @Mock
    Session session;
    @Mock
    Query query;


    @BeforeClass
    public static void setUpClass(){
    }

    @Before
    public void setUp(){
        Mockito.when(query.setParameter(any(int.class), any(Object.class))).thenReturn(query);
        Mockito.when(session.createQuery(any(String.class))).thenReturn(query);
        Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getTodosByUserIdShouldNotReturnNull(){
        User user = new User();
        assertNotNull(todoDao.getTodosByUserId(user.getId()));
    }
}

这是我的 DAO 类

@Component
@Transactional
public class TodoDao implements ITodoDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    @PostFilter("filterObject.userByUserId == authenticationFacade.getAuthenticatedFacade()")
    public List<Todo> getTodosByUserId(int userId) {
        List todos;
        todos = sessionFactory.getCurrentSession().createQuery("from Todo where userId = ?").setParameter(0, userId).list();
        return todos;
    }
}

但是当我运行测试时出现java.lang.NullPointerException 异常,nullPointerException 位于todos = sessionFactory.getCurrentSession().createQuery(...) 行的级别

【问题讨论】:

    标签: java unit-testing junit mockito


    【解决方案1】:

    在我目前打开的测试中,如果我将MockitoAnnotations.initMocks(this) 放在Mockito.when(...).thenReturn(...) 之后,我将得到NullPointerException

    尝试先进行初始化,然后再进行模拟。

    我的理解是MockitoAnnotations.initMocks(this) 初始化了存根依赖项。然后,这允许在存根上设置 when(...).thenReturn(...) 行为。如果您先尝试设置行为,则依赖项尚未初始化,因此会出现 NullPointerException。

    javadoc of mockito中有一点说明

    【讨论】:

    • 谢谢,我认为它解决了我的问题。对此有何解释?
    • 还要感谢@Sándor Juhos 在下面的回复中提出的建议。这是解决方案的一部分。
    【解决方案2】:

    .createQuery("from Todo where userId = ?") 方法调用返回 null。 您也应该设置模拟会话。

    【讨论】:

    • 即使这样我也有同样的问题,(我更新了我的帖子以添加会话标准模拟)
    • 现在 .setParameter(0, userId) 方法调用结果为空,你也应该设置模拟查询。
    • 谢谢。我添加了 setParameter 模拟,但它并没有解决我的问题。在添加您的所有建议后,@andrew.b.10 的回复确实解决了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多