首页 > 解决方案 > mockito 调用真实方法

问题描述

我有这个测试:但方法 checkIfHold 也被嘲笑

@RunWith(MockitoJUnitRunner.class)
public class FrontSecurityServiceTest {

    @Mock
    private FrontSecurityService frontSecurityService
            = mock( FrontSecurityService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));

    @Test
    public void test1() {
        when(frontSecurityService.getLoggedInUserId()).thenReturn("000");
        frontSecurityService.checkIfHold(9L);
    }
}

我也试过

   @Mock
    PerService perService;
    @Spy
    private FrontSecurityService frontSecurityService = new FrontOfficeSecurityService(perService);

但不是嘲笑方法getLoggedInUserId(),getLoggedInUserId 是公共的、非静态的和非最终的。

我也试过了,它可以工作,但是在 checkIfHold 内部调用 MenService 是 null

@RunWith(SpringJUnit4ClassRunner.class)
public class FrontSecurityServiceTest {

    @Mock
    MenService menService;
    @Mock
    FrontSecurityService frontSecurityService;
    @Rule
    public MockitoRule rule = MockitoJUnit.rule();


    @Test
    public void test1() {

        MenReturn menReturn1 = MenReturn.builder().build();
        when(menService.getMen(anyString(), anyLong())).thenReturn(Arrays.asList(menReturn1));
         when(frontSecurityService.checkIfHold(anyLong())).thenCallRealMethod();
when(frontSecurityService.getLoggedInUserId()).thenReturn("000");
        frontSecurityService.checkIfHold(9L);
    }

}

标签: spring-bootjunitmockito

解决方案


我想这@Spy就是你要找的。尽管如此,FrontSecurityService同时测试和模拟它对我来说似乎很奇怪。尝试以下操作:

@RunWith(MockitoJUnitRunner.class)
public class FrontSecurityServiceTest {

    @Spy
    private FrontSecurityService frontSecurityService;

    @Test
    public void test1() {
        when(frontSecurityService.getLoggedInUserId()).thenReturn("000");
        frontSecurityService.checkIfHold(9L);
    }
}

推荐阅读