gpt4 book ai didi

java - 如何在测试类中模拟 JNDI 数据源

转载 作者:行者123 更新时间:2023-11-30 05:28:45 25 4
gpt4 key购买 nike

我正在尝试测试我的 DAO 类,它有 2 个依赖项:dataSourcestringCrypto但应用程序不断抛出

Failed to obtain JDBC Connection: DataSource returned null from getConnection(): dataSource

我试图模拟的数据源依赖项是一个使用JndiDataSourceLookUp的bean这是

@Bean
public DataSource dataSource() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();

dataSourceLookup.setResourceRef(true);

DataSource dataSource = dataSourceLookup.getDataSource("castle/db");

return dataSource;
}

这是 DAO 类

public class PersonDAOImpl implements PersonDAO {

@Autowired
private DataSource dataSource;

@Autowired
private Cryptography stringCrypto;

private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

@Override
public List<Member> getAllMembers() {

this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

try {
List<Member> members = namedParameterJdbcTemplate.query(SqlStatement.GET_ALL_MEMBERS,
new MemberExtractor());

return members;
} catch (Exception e) {
e.printStackTrace();
return null;

}

}

正如您在此类中看到的,它有 2 个依赖项,我试图在下面的测试类中模拟它们

@RunWith(SpringRunner.class)
public class MembersControllerTest {

@Mock
DataSource dataSource;

@Mock
Cryptography stringCrypto;

@InjectMocks
PersonDAOImpl personDAOImpl;

@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
}

@Test
public void test() {

assertTrue(personDAOImpl.getAllMembers().size() > 0);

}

}

我尝试添加

@PostConstruct
private void initialization() {
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}

但它不起作用,每当我运行测试时,它都会抛出 failed to acquire jdbc connection 。抛出的异常根本没有帮助,所有其他类似的问题都是关于使用 xml 进行配置,并且接受的答案是建议一些 xml 配置,老实说,我不太理解,我什至不想在我的应用程序中使用 xml应用。我确实搜索了几乎所有相关问题,但没有发现任何有帮助的,所以我决定问它。

提前致谢

最佳答案

您仅模拟 DataSource,因此 NamedParameterJdbcTemplate 仍然会调用 getConnection() 来获取连接并执行查询。推荐的方法是将 NamedParameterJdbcTemplate 声明为 spring bean,然后需要模拟它

配置类

@Bean
public DataSource dataSource() {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();

dataSourceLookup.setResourceRef(true);

DataSource dataSource = dataSourceLookup.getDataSource("castle/db");

return dataSource;
}

@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate(DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);

}

测试类

 @RunWith(SpringRunner.class)
public class MembersControllerTest {

@Mock
DataSource dataSource;

@Mock
Cryptography stringCrypto;

@Mock
NamedParameterJdbcTemplate namedParameterJdbcTemplate;

@InjectMocks
PersonDAOImpl personDAOImpl;

@BeforeEach
void setUp() {
MockitoAnnotations.initMocks(this);
}

@Test
public void test() {

when(namedParameterJdbcTemplate.query(ArgumentMatchers.anyString(),
ArgumentMatchers.any(MemberExtractor.class))
.thenReturn(//List<Members>);
assertTrue(personDAOImpl.getAllMembers().size() > 0);

}

}

关于java - 如何在测试类中模拟 JNDI 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58002716/

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