带有 JdbcTemplate 自动装配的 SimpleJdbcCall 的 Junit

     2023-02-27     248

关键词:

【中文标题】带有 JdbcTemplate 自动装配的 SimpleJdbcCall 的 Junit【英文标题】:Junit for SimpleJdbcCall with JdbcTemplate Autowired 【发布时间】:2021-05-20 17:11:12 【问题描述】:

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

这是我尝试过的

下面是测试代码和仓库代码 我正在使用 Spring Boot 最新版本 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");
      

【问题讨论】:

【参考方案1】:

您似乎在这里混合了 JUnit 4 和 JUnit Jupiter(JUnit 5 的一部分)。

@RunWith 是 JUnit 4(JUnit Jupiter 等价于 @ExtendWith(MockitoExtension.class) @BeforeEach 是 JUnit Jupiter

此外,当您想模拟它时,不要手动初始化您的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() 

    

【讨论】:

使用 Spring Security 的自动装配依赖注入

...ity【发布时间】:2013-05-0313:11:23【问题描述】:我有一个带有注释驱动配置的springwebapp。所有控制器、存储库都是自动装配的。在集成SpringSecurity时,我定义了一个单独的security-app.xml。我创建了一个名为LoginUserServ 查看详情

自动化装配bean(代码片段)

...是不启动的,需要显式的配置Spring,从而命令Spring去寻找带有(@Component)注解的类,并为其创建bean。1、定义接口packagecom.seven.springTest.s 查看详情

跨项目自动装配时钟导致“未找到此类 Bean”异常

...】:我的项目设置如下。如图所示,我有一个辅助项目(带有2个@Autowired时钟),而我的主项目带有1个@Autowired时钟。所有三个时钟都表示同一个对象。当我启动应用程序时,我收到错 查看详情

spring学习系列自动化装配bean

...是不启动的,需要显式的配置Spring,从而命令Spring去寻找带有(@Component)注解的类,并为其创建bean。1、定义接口packagecom.seven.springTest.s 查看详情

方面类中的自动装配字段在测试模式下为空

...题描述】:我使用Springboot,在maaspect类中,我得到了两个带有@Autowired注释的字段。当我运行代码时,它工作正常,但是当我为这个类运行测试时,这两个自动装配的字段为空。有人可以告诉我需要做什么来解决这个问题吗?我... 查看详情

使用 jdbc 模板自动装配数据源问题的 Spring Boot 自动配置

...-2603:07:57【问题描述】:我是Spring和J2EE的新手。我在使用带有SpringBoot自动配置的JDBC模板时遇到问题。我所做的是以here提供的RESTfulWeb服务为例并决定 查看详情

使用 meta-inf 自动装配 bean

...【发布时间】:2021-10-0915:15:40【问题描述】:我有自己的带有弹簧组件的jar文件。我正在尝试在另一个项目中自动装配这个bean,但如果没有@Import或@ComponentScan,我将无法做到这一点。是否可以在没有额外注释的情况下在另一个... 查看详情

带有/多个参数的 JDBCTemplate 传递

】带有/多个参数的JDBCTemplate传递【英文标题】:JBDCTemplatePassw/multipleparameters【发布时间】:2016-01-0812:11:31【问题描述】:事情是这样的……我无法通过以下代码传递以下语句“this”从未打印,因此结果集为0,但查询似乎正确。... 查看详情

spring3.2注释自动装配多个构造函数(代码片段)

...或多个required=false构造函数自动装配注释,并且只有一个带有required=true,则会抛出异常。org.springf 查看详情

使用带有 @GeneratedValue 生成的 PrimaryKey 的 jdbctemplate 插入行

】使用带有@GeneratedValue生成的PrimaryKey的jdbctemplate插入行【英文标题】:InsertrowusingjdbctemplatewithPrimaryKeygeneratedby@GeneratedValue【发布时间】:2019-08-1216:28:17【问题描述】:我在SpringBoot应用程序的Oracle表中插入一行。主键需要使用注... 查看详情

springbootspringboot自动装配原理解析

...rredImportSelector)实现延迟加载和分组的功能,导入例如带有@ConditionalO 查看详情

使用@SpringBootTest时如何在测试类中自动装配bean

...est【发布时间】:2019-05-1715:29:55【问题描述】:我有一个带有@SpringBootTest注释的集成测试类,它启动完整的应用程序上下文并让我执行我的测试。但是我无法将@Autowiredbean放入测试类本身。相反,我得到一个错误:没有 查看详情

带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源

】带有TransactionTemplate和ConnectionPool的JDBCTemplate,使用哪个数据源【英文标题】:JDBCTemplatewithTransactionTemplateandConnectionPool,whichdatasourcetouse【发布时间】:2011-08-2811:53:53【问题描述】:我不太确定如何提出这个问题,所以请随时告... 查看详情

datasource,drivermanger,driver和jdbctemplate(代码片段)

...c.Driver");在spring框架中DataSource类可以根据其配置自动装配JdbcTemplate为springJDBC的核心类,通过setDataSource设置数据源,里面含有完整的sql语句操作方法    查看详情

spring随笔-bean装配-自动装配

... 1.XML文件进行显式装配  2.java中进行显示装配  3.自动化装配1.自动化装配的两种实现方式  1.组件扫描:Spring会自动发现应用上下文中创建的bean  2.自动装配:Spring自动满足bean之间的依赖自动装配自动装配 查看详情

使用 Spring Boot 自动装配具有 jpa 和非 jpa 特征的多个数据源

...述】:我有两个数据库配置javaconfig类-一个用于JPA目的,带有transactionManager()和entityManagerFac 查看详情

带有命名参数和行映射器的列表的Java Jdbctemplate查询?

】带有命名参数和行映射器的列表的JavaJdbctemplate查询?【英文标题】:JavaJdbctemplatequeryforlistwithnamedparameterandrowmapper?【发布时间】:2018-09-2213:20:25【问题描述】:我正在尝试实现一个Jdbctemplate查询方法,该方法将一个命名参数映... 查看详情

具有自动装配的字段但得到无法自动装配字段消息

】具有自动装配的字段但得到无法自动装配字段消息【英文标题】:FieldwithautowirebutgetCouldnotautowirefieldmessage【发布时间】:2016-02-2315:01:32【问题描述】:在SpringBoot应用程序中,我收到此错误创建名为“webSecurityConfigurerAdapter”的b... 查看详情