gpt4 book ai didi

java - 在 Mockito 中替换数据源

转载 作者:行者123 更新时间:2023-12-04 05:54:15 25 4
gpt4 key购买 nike

我有在 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 处理创建这些类的模拟版本。

当然,当你这样做时,你会得到 模拟 这些类的版本,因此在您的数据源上调用所有这些方法将导致调用默认的 Mockito stub ......它什么都不做。

不知道你为什么要合并 @Mock对同一个对象进行方法调用,看起来您希望得到结果...

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com