如何不调用弹簧批次的特定方法



有没有办法用 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 用于更高级别的测试。

相关内容

  • 没有找到相关文章

最新更新