为了账号安全,请及时绑定邮箱和手机立即绑定

同一个类java中的模拟函数

同一个类java中的模拟函数

慕婉清6462132 2023-06-04 11:03:36
我正在为一个类编写单元测试,我需要模拟对同一个类中的方法的调用。//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:@Testpublic 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。
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

调用的时候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);

但是:这是一个非常糟糕的测试,你永远不需要这样做(间谍或模拟)。如果您测试一个类,那么您将测试所有类。 如果您需要模拟一个方法来测试另一个方法,那么其中一个方法可能属于另一个类。


查看完整回答
反对 回复 2023-06-04
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

或者在测试类的情况下。ClassA 有一个在 methodB() 内部调用的 methodA() 并且您对 methodB() 内部发生的所有事情都不感兴趣,那么您可以简单地对代表当前被测类的对象使用间谍,然后设置 methodB 的自定义行为() 用于例如。Mockito.doNothing().when() + @Spy。


@InjectMocks

@Spy

private ClassA testObj;


@BeforeEach

public void setUp() {


    super.setUp();

    

// the actual call of the methodB() will be totally ignored

    doNothing().when(testObj).methodB(input);

}


@Test

public void methodTest() {}


查看完整回答
反对 回复 2023-06-04
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信