我正在尝试使用Junit和Mockito嘲笑端到端方法(添加杂物方法)。很明显,在该方法中,我使用其他方法。我的疑问是:
- 要模拟端到端方法,我也需要模拟其他方法,对吧?
- 如何模拟添加方法中的方法?
我想要的简单示例是:
方法A
public int summing(int sum){
int A = 5;
int B = 23;
sum = SumOfIntegers(A,B);
return sum;
}
方法B
private int SumOfIntegers(int number1, int number2){
try{
result = number1 + number2;
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
,我该如何模拟班级的方法A,因为它调用了私人方法?
Unitests验证单元的公共可观察行为,即返回值和与其依赖关系的通信/em>
在您的情况下,问题是ServerProxy
有一个隐藏的依赖性。您不应该以该方法实例化,而不是在该类别中进行实例化...
如果您严格遵循关注/单一责任模式的分离 依赖性的实例化是其本身的责任,并且对象不应使用依赖关系来完成。
总而言之,您应该通过依赖性注入进行注入 ServerProxy
对象,最好是作为构造函数参数,很可能使用 di框架。在这种情况下,用一个模拟替换ServerProxy
是很重要的
您需要模拟addSomething()
属于的类。
假设您有一个使用该方法的类。
public class ClassB {
public String methodB(String jsonSomething) {
...
String result = addSomething("{}");
...
}
}
public class ClassA {
public String addSomething(String jsonSomething) {
...
}
}
在ClassB的测试类中,您将模拟Classa对象,并为addSomething
方法指定行为。您无需为addSomething
中的内容指定任何模拟行为。
@RunWith(MockitoJRunner.class)
public class ClassBTest {
@Mock
private ClassA classA;
@Test
testMethodB() {
given(classA.addSomething(anyString())).willReturn("{}"); // Here you are specifying the mocked behavior for addSomething
...
}
}
如果您打算模拟其范围是所测试方法本地范围的对象的方法,那么这可能是可以使用诸如PowerMock之类的东西,但实际上这通常是指您的代码'写得很好,很容易测试。
我将重新计算您的代码,以确保使用依赖项注入将要模拟方法的任何对象都包括在类级别上。然后,用Mockito对此进行嘲笑非常简单,通过在测试中用@mock注释标记这些对象,并用@InjectMocks标记您正在测试的类。然后,这将确保将对象的模拟注入测试中的测试中的类,而不是对象的真实实例,然后您可以将所有喜欢的方法存根。
您不模拟方法,嘲笑整个类,并使它们按照其方法的方式响应。然后,如果您在类内部使用方法A,并且此方法A使用方法B,则仅模拟方法A。不执行类中的代码,因此您无需模拟整个链条。这是嘲笑的重点。那是你问的吗?
因此,您永远不会模拟在主要方法中使用的方法。