测试方法而不初始化类



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

class ExampleClass {
   public ExampleClass(FirstClass fc, SecondClass sc, ThirdClass tc) {}
   public void methodToTest(FourthClass foc) {}
}

这里有一些选项:

    将方法设置为静态,这样就不需要对实际对象的引用。这将只工作,如果方法不需要任何状态的ExampleClass(即,它需要的一切都在方法参数传递)。
  • 将此方法提取到另一个类(可能使用方法对象模式),这样更容易单独测试。这个重构叫做用方法对象替换方法。

通常,在构造函数中有太多参数是一个不好的概念的暗示。你最好重新考虑你的对象和类,以减少给构造函数的参数。

如果你不想这样做,你仍然可以使用某种"testtil"来为你实例化类。


例子:

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) {
    }
}

好吧,看来我找到办法了。由于该方法与对象的状态无关,所以我可以模拟对象并命令MockRunner在调用它时使用真正的方法。它被命名为partial mocking。做这件事的方法是

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

据我所知,不初始化类就不能执行Test。

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

我不知道你的方法是什么,但如果你的应用程序可能的话,你可以让methodToTest静态,这将允许你在没有类实例的情况下调用它

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

使用来自powermockit的抑制项。

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

相关内容

  • 没有找到相关文章

最新更新