【问题标题】:When clause in Mockito JUnit is not working while calling method of testing class调用测试类的方法时,Mockito JUnit 中的 When 子句不起作用
【发布时间】:2021-07-05 08:27:25
【问题描述】:

我正在尝试存根测试类的方法。而且它不起作用。

就像在课堂下面测试一样

enter code here
    Class to test:
    public Class A{
        public String method1(){
          C c=new C();
          int num=c.methodC();
          B b=new B();
          String str=method2(b);
          return str;
        }
   public String method2(B b){
         
          String str=method2(b);
          return str;
        }
    }


JUnit class:

    @RunWith(JUnitPlatform.class)
      Class ATest {

      @InjectMocks
      A a;
    
      @Mock
      C c;
      @Mock
      A a1;

      @BeforeEach 
      public void initMocks() {
        MockitoAnnotations.initMocks(this);
      }
    
      @Test
      public void testMethod1(){

        Mockito.doReturn(34).when(c).methodC(anyString());
        a1=Mockito.mock(A.class);
        Mockito.doReturn("Added successfully").when(a1).method2(any(B.class));
        assertEquals("Added successfully", a.method1());
      }
    }

当我从 C 类中存根 methodC(...) 时,它正在工作。但是 A 类中的 method2(...) 不是存根。

请告诉我问题是什么,以及解决方案。

【问题讨论】:

  • 您没有将模拟传递给被测对象。您在被测方法中创建新的 B 和新的 C。除此之外还有一些拼写错误:A1 可能是 B 的一个实例。调用 initMocks 时不需要 Mockito.mock
  • 在任何一种情况下都编辑了我的帖子:无论是否使用 Mockito.mock,不管调用的是什么实际方法,而不是存根一个。当我调用同一测试类的方法时会发生这种情况。
  • 你仍然: 1. 在被测方法中创建新的 c 并在其上调用一个方法。因此,c. methodC 的存根不起作用。 2.你存根a1. method2,但调用a.method2。 a1 和 a 是 2 个不同的对象,这个存根也不起作用。如果你只想存根一个对象的某些部分,你需要一个@Spy,而不是一个模拟。
  • 我最初使用了 a.method2(..),它没有工作,所以尝试使用新对象,认为可能是 @InjectMock 不允许存根方法。在这两种情况下,它都不是调用存根方法而是调用实际方法。我得到:
  • 如果我使用相同的对象进行存根和调用测试方法,我会得到如下异常:传递给 when() 的参数不是模拟!

标签: mockito junit5 stubbing clause


【解决方案1】:

您有 2 个选项来模拟对象的某些部分。

选项 1:使用 @Spy 而不是 @Mock

@ExtendWith(MockitoExtension.class)
class ATest {

    @Spy
    A a;

    @Test
    public void testMethod1() {
        Mockito.doReturn("Added successfully").when(a).method2(any(B.class));
        assertEquals("Added successfully", a.method1());
    }
}

选项 2:使用模拟并标记真实实现

@ExtendWith(MockitoExtension.class)
class ATest {

    @Mock
    A a;

    @Test
    public void testMethod1() {
        Mockito.doReturn("Added successfully").when(a).method2(any(B.class));
        Mockito.doCallRealMethod().when(a).method1();
        assertEquals("Added successfully", a.method1());
    }
}

【讨论】:

  • 这些解决方案都不适合我 Lesiak。当方法在测试类中时,问题无法调用存根方法。
【解决方案2】:

我通过试错法发现,测试类中的方法不能被模拟。如果我们必须模拟一个方法,要么我们必须将这些方法移动到不同的类,要么不模拟它。这是唯一的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多