Junit for SimpleJdbcCall with JdbcTemplate Autowired
Junit for SimpleJdbcCall with JdbcTemplate Autowired
我如何测试使用 JdbcTemplate 和 SimpleJdbcCall 的存储库 class,如下所示
这是我试过的
下面是测试代码和仓库代码
我正在使用 Spring 启动最新版本的 junit 5 和 mockito。
我已尝试研究以下解决方案,但可以正常工作
@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
}
}
下面是存储库代码
@存储库
public class 数据存储库{
@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");
}
}
您似乎在混合使用 JUnit 4 和 JUnit Jupiter(JUnit 5 的一部分)。
@RunWith
是 JUnit 4(JUnit Jupiter 等价物是 @ExtendWith(MockitoExtension.class)
@BeforeEach
是 JUnit Jupiter
此外,当您想模拟它时,不要手动初始化您的 simpleJdbcCall
。当为你的 DataRepository
编写单元测试并让 Mockito 为你创建被测 class 时, @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() {
}
}
我如何测试使用 JdbcTemplate 和 SimpleJdbcCall 的存储库 class,如下所示
这是我试过的
下面是测试代码和仓库代码 我正在使用 Spring 启动最新版本的 junit 5 和 mockito。 我已尝试研究以下解决方案,但可以正常工作
@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
}
}
下面是存储库代码 @存储库 public class 数据存储库{
@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");
}
}
您似乎在混合使用 JUnit 4 和 JUnit Jupiter(JUnit 5 的一部分)。
@RunWith
是 JUnit 4(JUnit Jupiter 等价物是@ExtendWith(MockitoExtension.class)
@BeforeEach
是 JUnit Jupiter
此外,当您想模拟它时,不要手动初始化您的 simpleJdbcCall
。当为你的 DataRepository
编写单元测试并让 Mockito 为你创建被测 class 时, @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() {
}
}