我对单元测试很新,我想知道是否有办法在不初始化类的情况下测试方法。我问的原因是因为构造函数中有很多对象传递意味着很多模拟存根,而彻底检查methodToTest
似乎不使用任何对象属性。这不是我的代码,否则该方法可以转换为静态。
class ExampleClass {
public ExampleClass(FirstClass fc, SecondClass sc, ThirdClass tc) {}
public void methodToTest(FourthClass foc) {}
}
答案 0 :(得分:1)
你有一些选择:
答案 1 :(得分:1)
好吧,我似乎找到了办法。由于该方法与对象的状态无关,因此我可以模拟对象并命令MockRunner在调用它时使用实际方法。它被命名为部分模拟。这样做的方法是
ExampleClass = PowerMockito.mock(ExampleClass.class);
when(ExampleClass.methodToTest(foc)).thenCallRealMethod();
答案 2 :(得分: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) {
}
}
答案 3 :(得分:0)
据我所知,如果没有初始化课程,你就无法进行测试。
测试的三个步骤是安排,行动和断言。必须在安排部分初始化该类,以便在您正在测试的特定类中获取所需的方法。
答案 4 :(得分:0)
我不知道你的方法有什么用,但如果你的应用程序有可能你只能使methodToTest
静态,这将允许你在没有类的实例的情况下调用它。 / p>
或者,你可以通过在@BeforeClass
方法中创建一个用于所有测试的实例来避免过多的实例化,但是我再也不知道你的方法做了什么,这可能是不可取的。
答案 5 :(得分:0)
使用PowerMockito的抑制功能。
import org.powermock.api.support.membermodification.MemberModifier;
import org.powermock.api.support.membermodification.MemberMatcher;
suppress(MemberMatcher.constructor(ExampleClass.class))