我有在 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/