如何测试使用JdbcTemplate和SimpleJdbcCall的存储库类,如下所示
这就是我试过的
下面是我使用的Spring最新版本junit 5和mockito的测试代码和存储库代码。我试着研究了下面的解决方案,但它能起作用吗?
Mockito for SimpleJdbcCall with Spring JdbcTemplate
@RunWith(MockitoJUnitRunner.class)
public class DataRepositoryTest {
@InjectMocks
private DataRepository dataRepository
@Mock
private JdbcTemplate oracleJDBCTemplate;
@Mock
private SimpleJdbcCall simpleJdbcCall;
@BeforeEach
public void setup() {
MockitoAnnotations.initMocks(this);
simpleJdbcCall = new SimpleJdbcCall(oracleJDBCTemplate)
.withProcedureName("PROC_NAME_P1")
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
new SqlParameter("p_in_name", Types.VARCHAR),
new SqlParameter("p_age", Types.VARCHAR)
).returningResultSet("ref_cur", new DataRowMapper());
}
@Test
public void test()
{
System.out.println(" JdbcTemplate-- " + oracleJDBCTemplate ); // prints is oracleJDBCTemplate;
System.out.println(" simpleJdbcCall-- " + simpleJdbcCall ); //print object hascode
}
}下面是存储库代码@Repository公共类DataRepository{
@Autowired
@Qualifier("OracleJDBCTemplate")
private JdbcTemplate oracleJDBCTemplate;
private SimpleJdbcCall simpleJdbcCall;
@PostConstruct
public void init()
{
simpleJdbcCall = new SimpleJdbcCall(oracleJDBCTemplate)
.withProcedureName("PROC_NAME_P1")
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
new SqlParameter("p_in_name", Types.VARCHAR),
new SqlParameter("p_age", Types.VARCHAR)
).returningResultSet("ref_cur", new DataRowMapper());
}
@SuppressWarnings("unchecked")
public List<Person> getPerson(Data data) {
Map<String, Object> result =
simpleJdbcCall.execute(date.getName,date.getAge);
return (List<Person>) result.get("ref_cur");
}
}发布于 2021-02-18 14:51:54
看起来你在这里混合了JUnit 4和JUnit木星( JUnit 5的一部分)。
@RunWith是JUnit 4 (JUnit木星等效为@ExtendWith(MockitoExtension.class)@BeforeEach is JUnit JUnit)
此外,当您想要对simpleJdbcCall进行模拟时,不要手动初始化它。当为您的DataRepository编写单元测试并让Mockito为您创建测试中的类时,@PostConstruct不会被调用,所以可以模拟所有协作者。
下面的设置将模拟您的程序,您可以使用Mockito的when().thenReturn()来定义您的模拟程序的行为:
@ExendWith(MockitoExtension.class)
public class DataRepositoryTest {
@InjectMocks
private DataRepository dataRepository
@Mock
private JdbcTemplate oracleJDBCTemplate;
@Mock
private SimpleJdbcCall simpleJdbcCall;
@Test
void test() {
}
}https://stackoverflow.com/questions/66248287
复制相似问题