Junit 带Spring JdbcTemplate的SimpleJDBCall的Mockito

Junit 带Spring JdbcTemplate的SimpleJDBCall的Mockito,junit,mockito,jdbctemplate,powermockito,simplejdbccall,Junit,Mockito,Jdbctemplate,Powermockito,Simplejdbccall,我在Junit测试用例中尝试了多种方法来执行存储过程,以针对out值进行测试,但不幸的是没有任何效果。 我的测试用例: public class DataTest { @Mock private static DataSource ds; @InjectMocks private DataDaoImpl dataDao = new DataDaoImpl(); @Mock private static JdbcTemplate jdbcTem

我在Junit测试用例中尝试了多种方法来执行存储过程,以针对out值进行测试,但不幸的是没有任何效果。 我的测试用例:

public class DataTest {

    @Mock
    private static DataSource ds;

    @InjectMocks
    private DataDaoImpl dataDao = new DataDaoImpl();

    @Mock
    private static JdbcTemplate jdbcTemplate;

    @Mock
    private static SimpleJdbcCall viewProc;


    @Before
    public void setUp() throws IOException, InterruptedException {
        MockitoAnnotations.initMocks(this);
        MockMvcBuilders.standaloneSetup(dataDao).build();
    }

    @BeforeClass
    public static void init() throws Exception {
        viewProc = new SimpleJdbcCall(ds).withSchemaName("schema")
                .withProcedureName("viewProc").withoutProcedureColumnMetaDataAccess()
                .declareParameters(new SqlParameter("param1", Types.VARCHAR))
                .declareParameters(new SqlParameter("param2", Types.VARCHAR))
                .returningResultSet("dataModules", Mockito.anyObject());

        jdbcTemplate = new JdbcTemplate(ds);

    }

    @Test
    public void findDataModules() throws Exception {

        String param1 = "abc";
        List<DataObj> md = new ArrayList<DataObj>();


        int size = 3;
        SqlParameterSource in = new MapSqlParameterSource().addValue("param1", "abc").addValue("param2",
                "123");
        Map map = viewProc.execute(in);
        md = (List<DataObj>) map.get("data");
        assertTrue("Expected Data  ", md.size() >= size);


    }

}
公共类数据测试{
@嘲弄
私有静态数据源ds;
@注射模拟
private DataDaoImpl dataDao=new DataDaoImpl();
@嘲弄
私有静态JdbcTemplate JdbcTemplate;
@嘲弄
私有静态SimpleJdbcCall viewProc;
@以前
public void setUp()引发IOException、InterruptedException{
initMocks(this);
MockMvcBuilders.standaloneSetup(dataDao.build();
}
@课前
公共静态void init()引发异常{
viewProc=newsimplejdbccall(ds).withSchemaName(“schema”)
.withProcedureName(“viewProc”).WithOutProcedureRecolumnMetadataAccess()
.declareParameters(新的SqlParameter(“param1”,Types.VARCHAR))
.declareParameters(新的SqlParameter(“param2”,Types.VARCHAR))
.returningResultSet(“数据模块”,Mockito.anyObject());
jdbcTemplate=新的jdbcTemplate(ds);
}
@试验
public void findDataModules()引发异常{
字符串param1=“abc”;
List md=new ArrayList();
int size=3;
SqlParameterSource in=new-MapSqlParameterSource().addValue(“param1”,“abc”).addValue(“param2”,
"123");
Map Map=viewProc.execute(in);
md=(List)map.get(“数据”);
assertTrue(“预期数据”,md.size()>=size);
}
}
我的主要班级:

@Repository
public class DataDaoImpl implements DataDao {

    protected Logger logger = LoggerFactory.getLogger(getClass());

    @Resource(name = "db")
    private DataSource db;

    private SimpleJdbcCall viewProc;

    private JdbcTemplate jdbcTemplate;

    /**
     * Initialization of Stored Procs and JDBC Template
     * 
     * @throws Exception
     */
    @PostConstruct
    public void init() throws Exception {
        viewProc = new SimpleJdbcCall(db).withSchemaName("schema")
                .withProcedureName("viewProc").withoutProcedureColumnMetaDataAccess()
                .declareParameters(new SqlParameter("param1", Types.VARCHAR))
                .declareParameters(new SqlParameter("param2", Types.VARCHAR))
                .returningResultSet("data", new ViewDataRowMapper());

        jdbcTemplate = new JdbcTemplate(db);

    }

        @Override
    public List<Data> findUniqueDataModules(String p1, String p2) throws Exception {
        List<DataObj> dataModules = new ArrayList<DataObj>();
        try {
            SqlParameterSource in = new MapSqlParameterSource().addValue("param1", p1).addValue("param2",
                    p2);
            Map map = viewUniqueDataModulesByLicense.execute(in);
            dataModules = (List<DataObj>) map.get("data");
        } catch (Exception e) {
            //Hnadel Exception
        }
        return dataModules;
    }

    }
@存储库
公共类DataDaoImpl实现DataDao{
受保护的日志记录器=LoggerFactory.getLogger(getClass());
@资源(name=“db”)
私有数据源数据库;
私有SimpleJdbcCall viewProc;
私有JdbcTemplate JdbcTemplate;
/**
*存储过程和JDBC模板的初始化
* 
*@抛出异常
*/
@施工后
public void init()引发异常{
viewProc=newsimplejdbccall(db).withSchemaName(“schema”)
.withProcedureName(“viewProc”).WithOutProcedureRecolumnMetadataAccess()
.declareParameters(新的SqlParameter(“param1”,Types.VARCHAR))
.declareParameters(新的SqlParameter(“param2”,Types.VARCHAR))
.returningResultSet(“数据”,新的ViewDataRowMapper());
jdbcTemplate=新的jdbcTemplate(db);
}
@凌驾
公共列表FindUniqueDataModule(字符串p1、字符串p2)引发异常{
List dataModules=new ArrayList();
试一试{
SqlParameterSource in=new-MapSqlParameterSource().addValue(“param1”,p1).addValue(“param2”,
p2);
Map Map=viewUniqueDataModulesByLicense.execute(在中);
dataModules=(List)map.get(“数据”);
}捕获(例外e){
//Hnadel例外
}
返回数据模块;
}
}
上面的代码给出了一个例外,说明需要数据源。 我试过Mockito,powerMockito,但它返回的是空地图。mock也不例外。 我对任何能够通过测试用例的解决方案都没有意见。
修改命名

虽然我讨厌在测试中使用反射,但我相信它可以帮助您解决您的问题。在这里,初始化之后,我将字段
viewProc
设置为模拟对象,您可以在测试中使用它
@PostConstruct
是与Spring相关的注释,因此在初始化它时不会调用它

类数据测试{
私有DataDaoImpl dataDao;
@嘲弄
私有数据源;
@嘲弄
私有SimpleJdbcCall;
@之前
无效设置(){
initMocks(this);
this.dataDao=newdatadaoimpl(数据源);
ReflectionTestUtils.setField(this.dataDao,“viewProc”,jdbcCall);
}
@试验
void findUniqueDataModules()引发异常{
//鉴于:
Map Map=newhashmap();
map.put(“data”,Arrays.asList(new DataDaoImpl.DataObj(),new DataDaoImpl.DataObj());
//模拟:
当(jdbcCall.execute(any(SqlParameterSource.class))。然后返回(map);
//当:
List uniqueDataModules=this.dataDao.findUniqueDataModules(“a”、“b”);
//然后:
assertEquals(2,uniqueDataModules.size());
}
}

另一个解决方案是针对测试数据库(如H2)测试该方法。但这不是单元测试。

您能展示一下要测试的代码吗?@Mensur使用主类进行了更新。谢谢Mensure,1)我没有在构造函数中初始化数据源。2) 我们没有方法DataObj(),新的DataDaoImpl.DataObj()。我知道,但我只是尝试创建一个不同的类似环境。关键是,您可以使用反射来注入模拟对象。明白了,我正在尝试使用它,但它正在根据我创建的对象检查大小。另外,请让我知道如何处理全局映射,我必须测试一个在类中全局定义映射的方法。断言就是为了它而存在的。我想不出比这更好的断言了。至于全局地图,您可以添加到原始问题或创建新问题,我们将拭目以待。