【问题标题】:some help on Mockito关于 Mockito 的一些帮助
【发布时间】:2012-06-17 10:57:02
【问题描述】:

我有以下结构:

public class MyDao{

private JdbcTemplate  jdbcTemplate;
private DataSource dataSource;


public DataSource getDataSource() {
    return dataSource;
}


public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public VCASDao(DataSource dataSource ){
        jdbcTemplate = new JdbcTemplate(dataSource);
    }
}

一些经理类

 public class MyManager{

MyDao dao = null;
private DataSource dataSource;

public MyManager(){}

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    } 

   public void someMethod(Object o){
      dao.save(o);
   }
   }
}

和外观类

public class MyFacadeClass{

private MyManager manager;

public MyFacadeClass(){
 manager = new MyManager();
}

public void someFacadeMethod(Object o){
 manager.someMethod(o);
}

}

现在我想用 JUnit 和 Mockito 来测试它。我的问题是我没有 JNDI 模式,我需要使用基于 HSQLDB 的 DataSource 模拟 JdbcTemplate。

我的嘲讽是这样的:

@Mock
static BasicDataSource dataSource ;

@Mock
static JdbcTemplate jdbcTemplate ;

@Mock 
MyDao dao;

MyFacadeClass myFacadeClass = new MyFacadeClass();

    @BeforeClass
    public static void init(){
          dataSource = new BasicDataSource();
      dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
          dataSource.setUrl("jdbc:hsqldb:mem:Test");
          dataSource.setUsername("sa");
          dataSource.setPassword("");
          dataSource.setInitialSize(5);
          dataSource.setMaxActive(10);
          dataSource.setPoolPreparedStatements(true);
          dataSource.setMaxOpenPreparedStatements(10);
          jdbcTemplate = new JdbcTemplate(dataSource);
          jdbcTemplate
          .execute("create Some Table");
    }


@Test
public void testSomeFacadeMethod(){
Object o = new Object();
myFacadeClass.someFacadeMethod(o);
}

我在 MyManager 构造函数中遇到异常,即“some_DB”的 JNDI 名称不存在。

我认为我对 Mocking 通用方法有疑问。请帮忙。

P.S:我在这个项目中没有使用 spring,只是使用 JdbcTemplate 类来简化代码。

更新:

我更改了我的课程,但现在 dao 对象为空。

【问题讨论】:

  • 在模拟 DAO 时,应该不需要创建数据源。最大的问题是你想在这里测试什么?通常,您模拟依赖项(已注入或在构造函数中传递)。

标签: java junit mocking mockito


【解决方案1】:

根据您发布的内容,我推测您想测试 MyFacadeClass。如果确实是这样,那么您在这里嘲笑错误的东西。

唯一有趣的关系是MyFacadeClass -> MyManager。 JNDI 和 JdbcTemplate 甚至对 MyFacadeClass 都不可见,你为什么要让它们出现在你的测试中;)

这是我要走的方向,同时保持相同的架构:

  1. 所以在MyFacadeClassTest中你应该只模拟MyManager并将其注入MyFacadeClass,并测试相关场景。

  2. MyManager 中,我建议您不要测试JNDI 的东西,例如,您可以创建一个直接采用MyDao 对象的包可见构造函数。将这些 JNDI 内容外部化到另一个类中会更好,它可能类似于 MyDaoProvider。 然后在MyManagerTest 中测试MyManagerMyDao 模拟之间的相关交互。

  3. 最后,您需要测试MyDao,因为只能使用真实数据库正确测试 DAO,这意味着它需要另一个系统才能运行。此测试是集成测试。您将针对真实数据库(Oracle 等)或内存数据库(HSQLDB 等)运行它,在这种情况下,您将根据您的测试环境创建一个真实的 JdbcTemplate,并将其注入 DAO .此外,您根本无法运行这些测试,而是运行业务验收测试。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    MyManager 不应该查找数据源。应该将数据源注入其中。这就是Dependency Injection 原则。它使测试更容易,因为您可以轻松地将自己的实现放入其中(在这种情况下是您自己的数据源)。

    另一种选择是将getDataSource() 方法添加到MyManager 类中,然后对其进行模拟。

    【讨论】:

    • 我稍微改了一下,但现在 dao 为空。请查看我的更新和修改类
    • 您还没有在管理器类中设置数据源。这就是为什么它是空的。模拟该方法或在其上调用setDataSource
    • 很抱歉我没有找到你。我应该在单元测试中手动添加它吗?我应该如何以及在哪里做呢?
    猜你喜欢
    • 2011-04-08
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多