有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我尝试创建了两个实例,例如 @注射模拟 Foo fooInstance和@Mock Foo fooInstanceMock; 我的想法是区分要注入的实例和要模拟的实例。 我还尝试将Spy与InjectMock一起使用,但它返回一个异常

实际类语法-

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) 个答案

  1. # 1 楼答案

    @InjectMocks用于将测试中定义的模拟注入到具有此注释的非模拟实例中

    在您的用例中,看起来您正在尝试做一些不同的事情-您希望通过x的实际实现来真正实现Foo,但要模仿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);
        }
    }