java - Spring JUnit 和 Mockito - SimpleJdbcTemplate

标签 java spring mockito jdbctemplate

给定一个扩展 SimpleJdbcDaoSupport 的类,你如何模拟 SimpleJdbcTemplate?

public class SimpleJdbcDaoSupportExtension extends SimpleJdbcDaoSupport {  
     public SimpleJdbcDaoSupportExtension (JdbcTemplate jdbcTemplate){  
             super.setJdbcTemplate(jdbcTemplate);  
     }

     public MyDomainObj getResult(){
         SimpleJdbcTemplate sjdbc = getSimpleJdbcTemplate();  
         MyDomainObj result = sjdbc.query(*whatever necessary args*.);
         return result;
     }
}

然后,使用 Mockito:
public class Test {  
    @Mock private JdbcTemplate mockedJdbcTemplateDedendency;  
    private SimpleJdbcDaoSupportExtension testObj;  

    @Before
    public void doBeforeEachTestCase() {
        MockitoAnnotations.initMocks(this);
        SimpleJdbcDaoSupportExtension sje = new SimpleJdbcDaoSupportExtension (mockedJdbcTemplateDedendency);
    }  
    @Test
    public final void test(){           
        when(mockedJdbcTemplateDedendency.query("what to query").thenReturn(new MyDomainObj());
    }
}

模拟的 JdbcTemplate 被注入(inject),但由于 dao 类依赖 SimpleJdbcTemplate 进行查询(用于映射到对象),并且它是由 SimpleJdbcDaoSupport 在内部构造的 - 模拟 JdcbTemplate 对 SimpleJdbcTemplate 没有影响。那么如何做到这一点,当它没有公共(public) setter 时,并且构造 SimpleJdbcTemplate 的唯一方法是依赖该方法,getSimpleJdbcObject()?

最佳答案

而不是模拟具体的类,你应该模拟一个接口(interface)(它有你需要的方法)。

例如。:

public class SimpleJdbcDaoSupportExtension extends SimpleJdbcDaoSupport implements MyDomainDao{  
     public SimpleJdbcDaoSupportExtension (JdbcTemplate jdbcTemplate){  
             super.setJdbcTemplate(jdbcTemplate);  
     }

     public MyDomainObj getResult(){
         SimpleJdbcTemplate sjdbc = getSimpleJdbcTemplate();  
         MyDomainObj result = sjdbc.query(*whatever necessary args*.);
         return result;
     }
}

public class Test {  
    @Mock private MyDomainDao myDomainDao ;
    private YourController yourController;  

    @Before
    public void doBeforeEachTestCase() {
        MockitoAnnotations.initMocks(this);
        yourController = new YourController(myDomainDao);
    }  
    @Test
    public final void testSomething(){           
        when(myDomainDao.getResult().thenReturn(new MyDomainObj());
        //on to testing the usages of myDomainDao
        yourController.doSomething();
        //verify
        verify(myDomainDao, times(2)).getResult();
    }
}

关于java - Spring JUnit 和 Mockito - SimpleJdbcTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4973517/

相关文章:

java - 字符类减法,Java语法转RegexBuddy

Java 语义 - 有没有办法写得更好?

java - 所有 Spring Framework Java 配置注入(inject)示例都有问题吗?

junit - Mockito中的“测试失败消息”:参数不同!通缉:

java - 如何使用 hibernate <join><any>?

Java类删除后重新编译还是没有变化?

java - Spring OAuth2详解授权服务器配置

java - 尝试将我的 main/java 类文件编译为 .jar,然后也生成 .war

java - 无法使用 Mockito 返回类对象

java - 如何对没有参数的 void 方法进行单元测试