【问题标题】:How to test a utility method that returns a new instance using Jupiter in Java?如何使用 Java 中的 Jupiter 测试返回新实例的实用程序方法?
【发布时间】:2021-05-27 17:17:24
【问题描述】:

我有一个类似的东西:

class User {
    String name;
}

class Contacts {
    User getUser() {
        return new User();
    }
}

我这样做是为了在我的测试中可以模拟如下方法:

@ExtendWith(MockitoExtension.class)
class ContactsTest {
    @Spy
    private Contacts sut;

    @Mock
    private User user;

    @Test
    void testSomething() {
        doReturn(user).when(sut).getUser();
    }

    @Test
    void testGetUser() {
        // verify(new User(), times(1));
        // verify(user, times(1));
    }
}

我如何测试testGetUser

上面评论的我仅有的两个想法给了我这些错误:

对于第一个:

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type User and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();

第二个

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:

【问题讨论】:

    标签: java junit mockito junit-jupiter


    【解决方案1】:

    首先,由于您的被测单元是Contacts 类,因此无需在其上使用spy 并模拟其行为,因为这是您需要测试的类。所以,我会继续删除它。

    现在关于您的问题,您需要测试的是getUser 的实际结果,因此最简单的测试是在Contacts 的实例上调用该方法并断言返回的结果是non-null User 对象的实例。

    如果您真的想测试 User 类的构造函数是否被调用,您将需要使用 PowerMock 实际模拟该调用(建议不要这样做,而且很可能甚至不适用于 JUnit5)或使用mockito-inline

    完成此操作后,您将能够从构造函数调用中返回一个模拟的 User 实例,然后您可以在该实例上运行断言。

    【讨论】:

    • 太棒了!感谢您的解释,non-null 实例实际上解决了它,一旦我被允许,我会接受答案
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多