当前位置: 首页 > 知识库问答 >
问题:

JUnit Mockito@InjectMock一个自动连接的Sessionfactory Bean

弘靖琪
2023-03-14

我创建了一个特殊的应用程序ontext-test.xml在我的测试类中使用它。

应用程序上下文测试。xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">

    <context:property-placeholder location="classpath:db/database.properties"/>
    <context:annotation-config />


    <!--        DATASOURCE                      -->
    <jdbc:embedded-database id="h2dataSource" type="H2">
        <jdbc:script location="classpath:db/sql/create-db.sql" />
        <jdbc:script location="classpath:db/sql/insert-data.sql" />
    </jdbc:embedded-database>

    <!-- SESSION FACTORY -->
    <bean id="testSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="h2dataSource"/>
        <property name="packagesToScan" value="com.medkhelifi.tutorials.todolist.models.entities"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect"> ${hibernate.dialect} </prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <!-- MUST have transaction manager, using aop and aspects  -->
    <bean id="testTransactionManager"
          class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="testSessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="testTransactionManager" />
</beans>

现在,我想使用我的testSessionFactory作为自动安装的Bean并将其注入到我的模拟中。

TodoDaoTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (value = "classpath:/conf/applicationContext-test.xml")
public class TodoDaoTest {

    @Autowired
    @Mock
    SessionFactory testSessionFactory;

    @InjectMocks
    TodoDao todoDao;


    private boolean mockInitialized = false;

    @Before
    public void setUp(){
        if(!mockInitialized) {
            MockitoAnnotations.initMocks(this);
            mockInitialized = true;
        }    
    }

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

这是我的TodoDao类TodoDao。Java语言

@Component
@Transactional
public class TodoDao implements ITodoDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Autowired
    private AuthenticationFacade authenticationFacade;

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

当我执行我的测试方法时,我得到了一个java。com上的lang.NullPointerException。梅德赫利菲。教程。托多利斯特。模型。道。TodoDao。getTodosByUserId(TodoDao.java:30)在第30行(如TodoDao.java类所示),我不知道是否遗漏了什么。

共有1个答案

郝乐心
2023-03-14

您还没有为您的sesionFactorymock定义行为。因此,当您的方法调用sesionFactory.getMONtSession()时,它返回null,这将导致NullPointerException

在您的测试方法getTodos ByUserIdShouldNotReportnNull或您的setUp方法中添加以下代码,您还需要更多的模拟对象:

when(sessionFactory.getCurrentSession())。然后返回(sessionMock) when(sessionMock.createQuery(“from Todo where userId=?”)。然后返回(queryMock)

 类似资料:
  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • USB自动连接 使用USB连接线连接外接装置与已开启电源的PSP™后,PSP™会自动更换为USB模式。 关 不自动更换为USB模式。 开 自动更换为USB模式。 提示 正使用游戏等部份机能时,即使连接USB连接线,亦不会自动更换为USB模式。

  • 问题内容: 背景: 我有一个Spring 2.5 / Java / Tomcat应用程序。下面的bean在整个应用程序中的许多地方都使用过 以下是新的bean: 第一个bean的配置如下(包含了软件包中的所有bean) 第二个(新)bean是单独配置的 启动服务器时,这(当然)会导致异常: 从试图像这样自动装配bean的类中 因为有两个bean实现相同的接口。 问题: 是否可以配置Bean,以便

  • 我有一个spring 2.5/Java/Tomcat应用程序。下面有一个bean,在整个应用程序的许多地方都使用了这个bean 和以下新bean: 第一个bean是这样配置的(包中的所有bean都包含在内) 第二个(新的)bean是单独配置的 这会导致(当然)启动服务器时出现异常: 嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitio

  • 这是我的当前设置:ProjectRepo: ProjectService: ProjectRestController:

  • 我的Spring MVC Web应用程序中有这个控制器, 其中SpitleRepository是一个接口: 其中,SpitleRepository的实现如下: 即使我已经自动装配,我得到: 组织。springframework。豆。工厂UnsatifiedDependencyException:创建名为“SpitleController”的bean时出错,该bean在文件[C:\java\Work