猿问

同一个类java中的模拟函数

我正在为一个类编写单元测试,我需要模拟对同一个类中的方法的调用。


//My class:

public class Class {

   public void functionA(arguments){

      ...

      String s3 = functionB(s1, s2);

   }


   public String functionB(String s1, String s2){

     ...

     return s3;

   }

}




//My Test:

@Test

public void functionA_Test(){

   Class class = new Class(dependency);

   Class spyClass = spy(class);


   mockString = "this is a mock";

   when(spyClass.functionB(any(),any()).thenReturn(mockString);


   spyClass.functionA(arguments);

}

当我调试测试功能时,到达后 when(spyClass.functionB(any(),any()).thenReturn(mockString);,程序跳转到主类,里面functionB,运行它。我想要的是s3=mockString在调用时functionB自动分配functionA。


慕婉清6462132
浏览 126回答 2
2回答

慕标琳琳

调用的时候when(spyClass.functionB(any(),any()).thenReturn(mockString)确实会走debug模式下的real方法。但是这个方法被嘲笑了,你functionA得到了mockString. 它确实有效。我真的不明白为什么看到你可以进入调试模式是一个问题。要回答这个问题,使用mock不会通过该方法:Class mockClass = mock(Class.class);when(mockClass.functionB(any(),any())).thenReturn(mockString);when(mockClass.functionA(arguments)).thenCallRealMethod();mockClass.functionA(arguments);但是:这是一个非常糟糕的测试,你永远不需要这样做(间谍或模拟)。如果您测试一个类,那么您将测试所有类。 如果您需要模拟一个方法来测试另一个方法,那么其中一个方法可能属于另一个类。

扬帆大鱼

或者在测试类的情况下。ClassA 有一个在 methodB() 内部调用的 methodA() 并且您对 methodB() 内部发生的所有事情都不感兴趣,那么您可以简单地对代表当前被测类的对象使用间谍,然后设置 methodB 的自定义行为() 用于例如。Mockito.doNothing().when() + @Spy。@InjectMocks@Spyprivate ClassA testObj;@BeforeEachpublic void setUp() {    super.setUp();    // the actual call of the methodB() will be totally ignored    doNothing().when(testObj).methodB(input);}@Testpublic void methodTest() {}
随时随地看视频慕课网APP

相关分类

Java
我要回答