当前位置: 代码迷 >> java >> 在不初始化类的情况下测试方法
  详细解决方案

在不初始化类的情况下测试方法

热度:28   发布时间:2023-08-02 10:53:09.0

我对单元测试很新,我想知道是否有办法在不初始化类的情况下测试方法。 我问的原因是因为在构造函数中有很多对象传递意味着很多methodToTest存根,而从彻底检查方法中, methodToTest似乎不使用任何对象属性。 这不是我的代码,否则该方法可以转换为静态。

class ExampleClass {
   public ExampleClass(FirstClass fc, SecondClass sc, ThirdClass tc) {}

   public void methodToTest(FourthClass foc) {}
}

你有一些选择:

  • 使方法静态,因此您不需要对实际对象的引用。 这只有在方法不需要ExampleClass的任何状态时才会起作用(即它需要的所有东西都在方法参数中传递)。
  • 将此方法提取到另一个类(可能使用方法对象模式),它更容易自行测试。 这种重构称为 。

好吧,我似乎找到了办法。 由于该方法与对象的状态无关,因此我可以模拟对象并命令MockRunner在调用它时使用实际方法。 它被称为部分嘲弄 这样做的方法是

    ExampleClass = PowerMockito.mock(ExampleClass.class);
    when(ExampleClass.methodToTest(foc)).thenCallRealMethod();

通常,构造函数中的许多参数都是对不良概念的暗示。 您最好重新考虑对象和类,以减少赋予构造函数的参数。

如果你不想,你仍然可以使用某种“TestUtil”来为你实例化类。


示例:

public class MyTestUtils {
    public createValidFirstClass() {
        return new FirstClass(/* some arguments here */);
    }
    public createValidSecondClass() {
        return new SecondClass(/* Some arguments here */);
    }
    public createValidThridClass() {
        return new ThridClass(/* Some arguments here */);
    }
    public createValidExampleClass() {
        return new ExampleClass(createValidFirstClass(), createValidSecondClass(), createValidThridClass());
    }
}

这个类必须在你的测试包中,而不是在你的项目中,不应该在测试之外使用,这将是一个非常糟糕的做法,使用Factory或Builder来实现你的真实项目。



无论如何,我认为最好的解决方案是重新考虑你的课程。
示例:

public class People {
    public People(String firstName, String lastName, Date birth, Date death) {
    }
}

正如您所看到的那样,控制所有给定参数的格式正确且不为空是一种痛苦。

传递给方法的参数数量可以通过这种方式减少。

public class People {
    public People(PeopleNames names, Period period) {
    }
}
public class PeopleNames {
    public People(String firstName, String lastName) {
    }
}
public class PeopleNames {
    public People(Date begin, Date end) {
    }
}

据我所知,如果没有初始化课程,你就无法进行测试。

测试的三个步骤是安排,行动和断言。 必须在安排部分初始化该类,以便在您正在测试的特定类中获取所需的方法。

我不知道你的方法做了什么,但是如果你的应用程序可以使用,你可以只使用methodToTest静态,这样你就可以在没有类的实例的情况下调用它。

或者,您可以通过在@BeforeClass方法中创建一个用于所有测试的实例来避免过多的实例化,但同样我不知道您的方法做了什么,这可能是不可取的。

使用PowerMockito的抑制。

import org.powermock.api.support.membermodification.MemberModifier; import org.powermock.api.support.membermodification.MemberMatcher; suppress(MemberMatcher.constructor(ExampleClass.class))

  相关解决方案