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

如何模拟@InjectMocks类中的方法?

程吕恭
2023-03-14

我正在SpringMVC上使用Mockito进行JUnit测试。测试使用@InjectMock和@Mock with when(方法(…)。然后返回(X)。问题是如何在@Inject实例中@Mock方法?

我尝试过创建两个实例,例如@InjectMocks Foo foInstance和@Mock Foo foInstanceMock;我的思维方式是区分注入什么实例和嘲笑什么实例。我也尝试使用间谍与InjectMocks,但它返回一个异常。

实际类语法-

class Foo {
    public X(..) {
        ...
        Y(...); // method call to Y
        ...
    }

    public Y(..) {
        ...
    }
}

测试语法-

public class FooTest {
    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @InjectMocks
    Foo fooInstance;

    @Mock
    Foo fooInstanceMock;

    @Test
    public void xTest{
        when(fooInstanceMock.Y(..)).thenReturn(true);
        Boolean result = fooInstance.X(25);
        Assert.assertTrue(result == true)
    }
}

我希望输出为true,然后返回true,但因为它认为这是一个injectMock,所以它进入了实现。

共有1个答案

邵骁
2023-03-14

@InjectMocks用于将您在测试中定义的mock注入具有此注释的非mock实例

在您的用例中,看起来您正在尝试做一些不同的事情-您想要一个真正的Foo,真正实现x,但要模仿y的实现,它调用x。这可以通过部分模拟或用Mockito的术语来说,间谍来实现:

public class FooTest{

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    // Default constructor is used to create a real Foo instance.
    // In the test's body, though, we'll override the behavior of SOME of the methods
    @Spy
    Foo fooInstance;

    @Test
    public void xTest {
        doReturn(true).when(fooInstance).y(/* arguments, presumably 25 */);
        Boolean result = fooInstance.x(25);
        Assert.assertTrue(result);
    }
}
 类似资料:
  • 例如,我有处理程序: 但是当我试图模拟它时,它实际上调用。如何使用来模拟它的方法?

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

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

  • 我在我的类中有一个方法,如下所示,我试图测试它: 在上面,是一个方法,它将文件名作为参数。它从AWS S3中获取该文件的inputstream。在测试Spock的方法时,我希望为方法提供一个模拟,因为我不想使用类中的这个方法的实现,因为它转到了另一个bucket名称。

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

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