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

时间:2019-08-30 10:11:07

标签: java unit-testing spring-mvc mockito

我正在Spring Mvc上使用Mockito进行JUnit测试。测试使用@InjectMock和@Mock以及when(method(..))。thenReturn(X)。问题是如何使用@Inject实例中的@Mock方法?

我尝试创建两个实例,例如 @InjectMocks Foo fooInstance和@Mock Foo fooInstanceMock; 我的思维方式是区分要注入的实例和要模拟的实例。 我还尝试将Spy与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 个答案:

答案 0 :(得分:2)

@InjectMocks用于将您在测试中定义的模拟注入到带有此批注的非模拟实例中。

在您的用例中,您似乎在尝试做一些不同的事情-您想要一个Foo的真实实例以及一个x的真实实现,但要嘲笑该实例的实现yx调用。可以通过部分模拟来完成,或者使用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);
    }
}