如何模拟Junit测试中DAO类的jdbcTemplate调用

fslejnso  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(189)

我有DAO类如下:-
//这里有一个类,它使用new // jdbcTemplate(dataSource)创建自己的jdbcTemplate

@Repository
public class MyDao {
  @Autowired
  @Qualifier("db2JdbcTemplate)"
  JdbcTemplate jdbcTemplateDB2;
  public int insertTable(Company comp) {
    int ret = 0;
    try {
      ret = this.jdbcTemplateDB2(db2DataSource).update(ïnsert into "+ table_name + "(COL1,COL2,...) values (?,?,?,..)",
           ps-> {
               ps.setString(1, comp.getName);
               .......
             });
      return ret;
    } catch (Exception ex) {
        // log etc
    }
  }
}

我的测试类如下:-

@RunWith(MockitoJUnitRunner.class)
    public class MyTest {

      @Mock 
      JdbcTemplate jdbcTemplateDB2;

      Company comp = new Company(); // this is followed by setter fn to set values.

      MyDao mydao = Mockito.mock(MyDao.class);
      Mockito.when(((jdbcTemplateDB2.update(any(String.class), 
                                     any(PreparedStatement.class))).thenReturn(2);
      ReflectionUtils.setField(mydao, "jdbcTemplateDB2", jdbcTemplateDB2);

      int bVal = mydao.insertTable(cmp);

    }
}

iVal没有获得值2。它正在进行原始更新调用并返回类似0/1的值。正在获得UnnecessaryStubbingException。如果我进行了宽松()调用,异常会消失,但结果是相同的(预期宽松只会删除警告)。如何使此存根工作?

qnyhuwrf

qnyhuwrf1#

在此行中:MyDao mydao = Mockito.mock(MyDao.class);您正在创建一个mock对象,它覆盖了您实际的类x行为,但您似乎想测试这个类,所以它没有任何意义。您需要做的是:创建类的一个实际示例并将mock注入其中(您使用ReflectionUtils来完成此操作,但Mockito有自己的简单机制来完成此操作)。

@Mock 
JdbcTemplate jdbcTemplateDB2;
// this tells mockito to create the object and inject mocks into it
@InjectMocks
MyDao myDao;

@Test
void test() {
    // define the behavior for the mock
    when(jdbcTemplateDB2.update(...)).thenReturn(2);

    // call the actual method of the tested class object (not a mock)
    int result = myDao.insertTable(...);

    // perform assertions (e.g. verify the result value)
}

推荐阅读:Mockito documentation(非常全面,但很简单)。
重要提示:是的。

相关问题