首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleJdbcCall与JdbcTemplate自动处理的Junit

SimpleJdbcCall与JdbcTemplate自动处理的Junit
EN

Stack Overflow用户
提问于 2021-02-17 18:56:36
回答 1查看 404关注 0票数 0

如何测试使用JdbcTemplate和SimpleJdbcCall的存储库类,如下所示

这就是我试过的

下面是我使用的Spring最新版本junit 5和mockito的测试代码和存储库代码。我试着研究了下面的解决方案,但它能起作用吗?

Mockito for SimpleJdbcCall with Spring JdbcTemplate

代码语言:javascript
复制
@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{

代码语言:javascript
复制
    @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");
      }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()来定义您的模拟程序的行为:

代码语言:javascript
复制
@ExendWith(MockitoExtension.class)
public class DataRepositoryTest {

    @InjectMocks
    private DataRepository dataRepository 
    
    @Mock
    private JdbcTemplate oracleJDBCTemplate;
    
    @Mock
    private SimpleJdbcCall simpleJdbcCall;

    @Test
    void test() {

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66248287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档