Как смоделировать источник данных JNDI в тестовом классе - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь проверить мой класс DAO, который имеет 2 зависимости, dataSource и stringCrypto, но приложение продолжает выдавать

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

зависимость источника данных, которую я пытаюсь смоделировать,bean-компонент, который использует JndiDataSourceLookUp, то есть

@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, которую я, честно говоря, не очень понимаю, и я даже не хочу использовать XML в своихприменение.Я действительно искал почти все связанные вопросы и не нашел ни одного из них полезным, поэтому я решил задать его.

заранее спасибо

1 Ответ

1 голос
/ 19 сентября 2019

Вы только издеваетесь DataSource, поэтому все же NamedParameterJdbcTemplate вызовет getConnection(), чтобы получить соединение и выполнить запрос.Рекомендуемый подход - объявить NamedParameterJdbcTemplate в качестве пружинного боба, а затем вам нужно смоделировать его

Класс конфигурации

@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);

     }

 }
...