4

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

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

   public void methodToTest(FourthClass foc) {}
}
4

6 回答 6

1

您在这里有一些选择:

  • 将方法设为静态,这样您就不需要对实际对象的引用。这仅在方法不需要 ExampleClass 的任何状态时才有效(即它需要的所有内容都在方法参数中传递)。
  • 将此方法提取到另一个更易于单独测试的类(可能使用方法对象模式)。这种重构称为用方法对象替换方法
于 2015-07-23T12:56:25.770 回答
1

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

    ExampleClass = PowerMockito.mock(ExampleClass.class);
    when(ExampleClass.methodToTest(foc)).thenCallRealMethod();
于 2015-07-24T15:15:16.937 回答
1

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

如果您不想这样做,您仍然可以使用某种“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) {
    }
}
于 2015-07-25T19:23:42.857 回答
0

据我所知,如果不初始化课程,您将无法进行测试。

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

于 2015-07-23T12:55:13.150 回答
0

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

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

于 2015-07-23T13:01:26.543 回答
0

使用 PowerMockito 的抑制。

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

于 2015-07-27T05:57:53.573 回答