借助@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
相关产品推荐
相关产品推荐

