为一个方法创建一个Junit测试用例,该方法包含对来自不同类的另一个方法的调用,该方法调用同一个类的不同方法

时间:2016-07-20 15:24:45

标签: unit-testing testing junit mocking mockito

我是java和单元测试的新手。我在为其中一种测试方法编写单元测试时遇到了问题。能帮帮我吧。

ClassA的:

Class   classA{ 
    /*......*/
    classB  method1_ClassA(parameters){
        /*.....
        .....
        .....
        .....
        .....*/
        String  some_Identifier =   method2_ClassA(parameters)

    }
    private String  method2_ClassA(parameters){
        /*contains call to the database*/
    }
}

ClassB的:

Class classB{
    /*.....*/
}

ClassC:

Class   classC{
    /*.......*/
    public  classB  method1_ClassC(parameters){
            classA  obj_ClassA  =   new classA();
            return  obj_ClassA.method1_classA(parameters);
    }
    /*.......*/

}

我正在尝试对classC进行单元测试。 ClassC中的一个方法调用类A的方法。我试图模拟这个方法,即method1_classA。但是这个方法调用另一个存在于同一个类中的方法。有人可以帮我解决如何为classC创建单元测试。

1 个答案:

答案 0 :(得分:0)

我想我现在正在解决你的问题。问题是你创建了不可测试的代码。它很简单:

class C {
  public B foo(parameters){
    A someA new A();
    return  someA.someMethod(parameters);

(请注意:我重写了你的例子,使用的名称对于java程序员来说并不那么令人困惑。例如,你没有将“class”放入类的名称中)

您的代码存在的问题是调用 new 。简单地说,该调用几乎不可能对该方法进行合理的单元测试。这里唯一合理的答案是:重做你的生产代码,并引入依赖注入,比如

class C {
  private A someA;

  public C() { this(new A()); }
  C(A someA) { this.someA = someA; }

  public B foo(parameters){            
    return  someA.someMethod(parameters);

你在那里看到:有一个“内部”构造函数可用于提供A对象。你使用这个构造函数给一个模拟的A到C;而且突然之间,你可以测试整个事情。

所以,长话短说:

a)我真的建议更改这段代码;因为设计糟糕,现在根本无法测试

b)如果你真的不能那样做;你可能想看看Powermock能否在这里帮助你......但要注意:这不是初学者的工具。它在很多层面都是强大而危险的。

无论如何,请注意this ...

相关问题