【问题标题】:nested methods testing using easy mock使用easy mock进行嵌套方法测试
【发布时间】:2012-09-14 22:25:14
【问题描述】:

我遇到了一个关于 java 中的类模拟的问题。

我将使用虚拟类来解释问题(以避免与项目相关的安全问题) 我们有一个 Employee 类

public class Employee {
public int netSalary() {
    int sal = totalSal() - 100;
    return sal;
}

public int totalSal() {
    // code to return value which is making db calls or remote calls
}

}

现在我的问题是如何在不调用 totalSal 方法的情况下测试 netSalary 方法 我已经尝试过 expect().andReturn() 以及 suppress(method());

但两者都不起作用

【问题讨论】:

    标签: class junit mockito easymock powermock


    【解决方案1】:

    如果这是通过 MVC 完成的,那么您的员工类应该有一个可以访问数据库的 DAO。注入在 totalSalary 中调用的 DAO 的模拟版本。

    每条评论:

    这是基于您上面的代码:

    public class MyTest{
    
        private class TestableEmployee extends Employee{
    
            public int totalSal(){
               return 55;
            }
        }
    
        @Test
        public void testIt(){
           Employee employee = new TestableEmployee();
    
           int netValue = employee.netSalary();
    
           assertEquals(netValue, 55-100);
        } 
    }
    

    【讨论】:

    • @John....这不是我想要的。我的意思是我们不想调用这个方法,虽然我很欣赏你的建议,但对这件事有点担心。
    • 另一种选择是创建一个覆盖totalSalary()Employee(比如TestableEmployee)的子类
    • 你能用参考或例子详细说明这个最重要的事情吗?任何指针。但我不想更改我的原始代码。
    【解决方案2】:

    您可以使用Mockito。模拟方法:

    when(employee.totalSal()).thenReturn(1000);
    

    【讨论】:

    • 你忘了说employee 应该是一个模拟或存根
    • @michael 员工不能模拟因为我们必须测试 netSalary() 方法所以我们不能模拟员工
    • 那么在这种情况下,这两种方法应该在单元测试中一起测试,因为它们都是紧密耦合在一起的。您可以使用 HSQL 等内存数据库来完成它。
    • Mockito 允许创建调用真实方法的模拟。例如,如果您创建像Employee employee = mock( Employee.class, withSettings().defaultAnswer( RETURNS_DEFAULTS ) ); 这样的模拟,然后像when( employee.totalSal() ).thenReturn( 1000 ); 这样存根一个方法totalSal(),那么对employee.netSalary() 的真正调用将产生900
    • @michael 实际上我有那个例子,我们可以在 mockito 的帮助下使用 spy 然后使用 when().thenreturn() 的东西,但问题是我们想用 easymock 来做.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多