有没有办法用 mockito 测试我的批处理并告诉不要调用进程调用 MyService 的特定方法.class,在该服务中,我得到了一些我不希望他调用的特定方法的业务逻辑,这可能吗?我确信执行doReturn将忽略我的方法(该方法是公共的),但仍然会接到电话。
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private MyRepo myRepoRepository;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testJob() throws Exception {
doReturn(true).when(spy(MyService.class)).validationETPer(any(Object.class), anyChar());
doReturn(true).when(spy(MyService.class)).validationMP(any(Object.class),anyChar());
JobExecution execution = jobLauncherTestUtils.launchJob();
assertEquals(execution.getStepExecutions().size(), 1);
for (StepExecution stepExecution : execution.getStepExecutions()) {
assertEquals(3, stepExecution.getReadCount());
assertEquals(3, stepExecution.getWriteCount());
}
assertEquals(ExitStatus.COMPLETED.getExitCode(), execution.getExitStatus().getExitCode());
assertEquals(2, myRepoRepository.count());
}
这一行不是你认为的那样:
doReturn(true).when(spy(MyService.class)).validationETPer(any(Object.class), anyChar());
spy(MyService.class)
创建一个新的MyService
实例并监视它。当然,由于您从不使用该实例,因此它完全没用。有一个实例被监视,但你没有把它存储在任何地方,你没有把它放在任何地方,所以没有人会使用它。
这条线并没有监视现存的每一MyService
,正如你似乎认为的那样,它创造了一个具体的MyService
实例并监视它。显然,这不是您想要的 - 您希望监视代码中实际使用的实例。
你可能想做的,更多的是这样的事情......
MyService mySpy = spy(MyService.class);
doReturn(true).when(mySpy).validationETPer(any(Object.class), anyChar());
jobLauncherTestUtils.setMyService( mySpy ); // or something like that
// and NOW you can test
如果不知道MyService
如何在实际代码中使用,就很难深入了解细节。就个人而言,我建议从没有 spring 的单元测试开始,并且只将 spring test 用于更高级别的测试。