【问题标题】:How can I mock methods that are also in @InjectMocks class?如何模拟 @InjectMocks 类中的方法?
【发布时间】:2020-01-03 14:14:53
【问题描述】:

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

我尝试创建两个实例,例如 @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)
    }
}

我除了输出为真,然后返回真,但因为它认为它是一个 injectMock 并进入实现。

【问题讨论】:

    标签: java unit-testing spring-mvc mockito


    【解决方案1】:

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

    在您的用例中,您似乎正在尝试做一些不同的事情 - 您想要一个真正的 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);
        }
    }
    

    【讨论】:

    • 感谢您向我介绍 Spy 注释。唯一的问题是我使用的设计模式没有任何构造函数。所以 Foo 实例没有构造函数,所以永远不是对象。会有其他方法吗?当我更改为 @Spy 时,它返回一个 nullPointerException - 可能是因为没有创建对象?
    • @MTQ 如果该类没有构造函数,则它隐式具有默认构造函数(即,公共的,没有参数)。你从哪里得到null
    • 是的@Spy 已解决此问题。将您的答案设置为正确答案。谢谢
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多