java - 替换 Mockito 中的数据源

标签 java junit mocking jndi mockito

我有在 Jboss 服务器上执行查询的代码。它具有基于 JNDI 的数据源,如下所示:

    public class JNDIBasedDao {

        DataSource dataSource;

        public JNDIBasedDao(){

            try {
                InitialContext ic = new InitialContext();
                dataSource = (DataSource) ic.lookup("java://bla-bla-bla");
            } catch (NamingException e) {
            e.printStackTrace();
            }


        }

public class Manager {

    public Manager(){}

    private JNDIBasedDao dao = new JNDIBasedDao();

    public void runOperation(){
        this.dao.executeInsert();
    }

在我的笔记本电脑上,我没有 Jboss,也无法连接到该服务器,并且想要在 HSQLDB 上运行单元测试。

我想基于 HSQLDB 从 apache commons 创建 BasicDataSource 并将该对象注入(inject)到 JNDIBasedDao 中。

@Mock
BasicDataSource dataSource = new BasicDataSource();

@Mock 
JNDIBasedDao dao = new JNDIBasedDao();

@InjectMocks
Manager manager = new Manager();
@Before
    public void initMocks(){
        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        dataSource.setUrl("jdbc:hsqldb:mem:dannyTest");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        dataSource.setInitialSize(5);
        dataSource.setMaxActive(10);
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxOpenPreparedStatements(10);

        MockitoAnnotations.initMocks(this);

    }

    @Test
    public void testRunOperartion() {
        manager.runOperartion();
    }

但我仍然收到 JNDI 错误。能做到吗?请帮忙。

最佳答案

由于您使用的是@Mock,因此无需通过调用这些对象的构造函数来实际实例化这些对象。

而不是:

@Mock
BasicDataSource dataSource = new BasicDataSource();

@Mock 
JNDIBasedDao dao = new JNDIBasedDao();

尝试:

@Mock
BasicDataSource dataSource;

@Mock 
JNDIBasedDao dao;

并让 Mockito 处理创建这些类的模拟版本。

当然,当您这样做时,您会获得这些类的Mock版本,因此在数据源上调用所有这些方法将导致调用默认的 Mockito stub ...这不会执行任何操作。

不知道为什么您将 @Mock 与同一个对象上的方法调用组合在一起,看起来您希望得到一个结果...

也许单步执行调试器并检查抛出异常时正在使用的对象的运行时类。他们可能不是您所期望的那样。

关于java - 替换 Mockito 中的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9712245/

相关文章:

java - Map<String, Integer> 中的问题计数

java - 设计——从哪里打开、插入和关闭数据库?

spring-boot - IntelliJ : How to set log levels for tests

python - 如何在 Mountebank 中使用代理记录请求和响应?

mocking - 从连续调用 Moq Mock 返回不同的结果或抛出异常

java - 负向先行匹配字符串,除非它出现在特定单词中。

java - 我到底什么时候应该使用 StringBuilder 而不是 String

unit-testing - Selenium 和 jUnit 的第一步——有什么好的教程吗?

spring - 如何推迟调用@PostConstruct,直到jUnit设置测试上下文

Python 单元测试 : How to patch an entire class and methods