You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

借助@InjectMocks简化依赖模拟:自动创建默认Mock的需求

解决Mockito未使用@Mock字段的问题

你可以通过手动构造InviteService实例,只显式传入需要验证的依赖Mock,其他未关注的依赖直接用Mockito.mock()创建默认Mock,这样就不用声明多余的@Mock字段,避免IDE提示未使用。

构造函数注入场景的修改方案

@ExtendWith(MockitoExtension.class)
class InviteServiceTests {

    @Mock
    private EmailSendingService emailSendingService;

    private InviteService inviteService;

    @BeforeEach
    void setUp() {
        // 手动构造InviteService,传入需要验证的EmailSendingService Mock,以及自动创建的UserService默认Mock
        inviteService = new InviteService(emailSendingService, Mockito.mock(UserService.class));
    }

    @Test
    void testSomething() {
        inviteService.inviteUser("user@example.com");
        verify(emailSendingService).sendEmail("user@example.com");
    }
}

Setter注入场景的修改方案

如果InviteService使用Setter注入而非构造函数注入,可按以下方式调整:

@ExtendWith(MockitoExtension.class)
class InviteServiceTests {

    @Mock
    private EmailSendingService emailSendingService;

    private InviteService inviteService;

    @BeforeEach
    void setUp() {
        inviteService = new InviteService();
        inviteService.setEmailSendingService(emailSendingService);
        // 注入默认Mock的UserService
        inviteService.setUserService(Mockito.mock(UserService.class));
    }

    @Test
    void testSomething() {
        inviteService.inviteUser("user@example.com");
        verify(emailSendingService).sendEmail("user@example.com");
    }
}

更简洁的Mock构造方式

还可以用Mockito的mock()方法结合withSettings(),直接创建InviteService实例并指定构造参数,同时保留真实方法的调用:

@ExtendWith(MockitoExtension.class)
class InviteServiceTests {

    private EmailSendingService emailSendingService = Mockito.mock(EmailSendingService.class);
    private InviteService inviteService = Mockito.mock(InviteService.class,
            Mockito.withSettings()
                    .useConstructor(emailSendingService, Mockito.mock(UserService.class))
                    .defaultAnswer(Mockito.CALLS_REAL_METHODS));

    @Test
    void testSomething() {
        inviteService.inviteUser("user@example.com");
        verify(emailSendingService).sendEmail("user@example.com");
    }
}

这种方式下,InviteService的真实方法会被调用,依赖的UserService是默认Mock,调用它的方法不会抛出NullPointerException,同时无需声明多余字段。

内容的提问来源于stack exchange,提问作者Dónal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:12:38