【问题标题】:How to Mock a JNDI datasource in a test class如何在测试类中模拟 JNDI 数据源
【发布时间】:2020-01-19 23:57:39
【问题描述】:

我正在尝试测试我的 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);
}

但它不起作用,每当我运行我的测试时,它都会抛出无法获取 jdbc 连接。 抛出的异常根本没有帮助,所有其他类似的问题都是关于使用 xml 配置的,并且接受的答案是建议一些 xml 配置,老实说,我真的不明白,我什至不想在我的应用。 我真的搜索了几乎所有相关的问题,但没有发现任何有用的问题,所以我决定问它。

提前致谢

【问题讨论】:

标签: java spring unit-testing mocking mockito


【解决方案1】:

您只是在模拟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);

     }

 }

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2023-03-15
    相关资源
    最近更新 更多