当前位置: 首页 > 知识库问答 >
问题:

如何模拟@InjectMocks类的方法?

子车勇锐
2023-03-14

例如,我有处理程序:

@Component
public class MyHandler {

  @AutoWired
  private MyDependency myDependency;

  public int someMethod() {
    ...
    return anotherMethod();
  }

  public int anotherMethod() {...}
}
@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {

  @InjectMocks
  private MyHandler myHandler;

  @Mock
  private MyDependency myDependency;

  @Test
  public void testSomeMethod() {
    when(myHandler.anotherMethod()).thenReturn(1);
    assertEquals(myHandler.someMethod() == 1);
  }
}

但是当我试图模拟它时,它实际上调用anothermethod()。如何使用MyHandler来模拟它的方法?

共有1个答案

易阳云
2023-03-14

首先,嘲笑MyHandler方法的原因如下:我们已经测试了AnotherMethod(),并且它有复杂的逻辑,那么,如果我们可以验证是否正在调用,我们为什么还要再次测试它(就像Somemethod()的一部分)呢?
我们可以通过:

@RunWith(MockitoJUnitRunner.class)
class MyHandlerTest {

  @Spy  
  @InjectMocks  
  private MyHandler myHandler;  

  @Mock  
  private MyDependency myDependency;  

  @Test  
  public void testSomeMethod() {  
    doReturn(1).when(myHandler).anotherMethod();  
    assertEquals(myHandler.someMethod() == 1);  
    verify(myHandler, times(1)).anotherMethod();  
  }  
}  

注意:对于“间谍”对象,我们需要使用doreturn而不是thenreturn(这里没有什么解释)

 类似资料:
  • 我正在SpringMVC上使用Mockito进行JUnit测试。测试使用@InjectMock和@Mock with when(方法(…)。然后返回(X)。问题是如何在@Inject实例中@Mock方法? 我尝试过创建两个实例,例如@InjectMocks Foo foInstance和@Mock Foo foInstanceMock;我的思维方式是区分注入什么实例和嘲笑什么实例。我也尝试使用间谍

  • 我遇到一个关于注入的mock注释类中的mock私有方法的问题。我的代码如下 当我用power mockito创建一个UT类时,foo类应该是@injectMocks,因为foBean应该作为模拟类注入。但是当foo类被标记为@injectMocks时,它不能像“do返回”(“xxx”)那样模仿它的私有方法。当(foo,“方法2”)时,它会引起关于这不能应用于injectMocks的错误。 它被封锁

  • 下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。

  • 我尝试模拟父类的受保护方法。因此,我使用&。我的家长班。

  • 所以我有一个类需要测试。我们把它叫做ClassToTest。它有两个Dao对象作为字段。 正如您所看到的,ClassToTest不包含任何构造函数或setter,我正在使用spring自动关联字段。 现在,我有了一个具有classToTest所需的所有依赖项的基本测试类: 并且testClass扩展了这个BaseTest类: 这将导致保存时出现空指针异常。但是,如果我将设置方法更改为: 考试通过了

  • 注释InjectMocks为我们提供了存根/填充私有成员和重用测试用例的方法。这是我们填充假成员时发生问题的概念代码。 问题是当我们模拟假的组件B时。然后,someShimmedMethod将返回null。似乎InjectMock无法将