【问题标题】:Mocking function in the same class java同一类java中的模拟函数
【发布时间】:2019-08-13 10:16:46
【问题描述】:

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

//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内,运行它。我想要的是在从functionA 调用functionB 时自动分配s3=mockString

【问题讨论】:

  • 为什么要模拟这个调用?如果你测试这个Class(顺便说一句:这是一个非常不好的名字),它应该调用自己的方法以及所有协作者的方法。

标签: java testing junit mocking mockito


【解决方案1】:

在调用when(spyClass.functionB(any(),any()).thenReturn(mockString)时,确实会在debug模式下走真实的方法。但是该方法被嘲笑了,你的functionA 得到了mockString。它确实有效。我真的不明白为什么看到你可以进入调试模式是个问题。

回答问题,使用mock不会走方法:

Class mockClass = mock(Class.class);

when(mockClass.functionB(any(),any())).thenReturn(mockString);
when(mockClass.functionA(arguments)).thenCallRealMethod();

mockClass.functionA(arguments);

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

【讨论】:

  • 谢谢,内容丰富。我将“functionB”的逻辑移到了另一个类。它需要被模拟,因为它负责使用 AWS 资源,而在测试上下文中它无法做到这一点。
  • 是的,这很完美:) 我通常也这样做。您的评论完美地说明了为什么 functionB 属于另一个类。如果它负责其他事情(在您的情况下使用 aws),那么单一职责原则说要移动它!
【解决方案2】:

或者在测试类的情况下,例如。 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() {}

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2017-01-05
    • 2012-02-24
    相关资源
    最近更新 更多