Перемешивание JobExplorer с использованием @MockBean, генерирующее исключение: InstanceAlreadyException
"Как я могу издеваться над JobExecution при тестировании одного шага с помощью JobLauncherTestUtils?"
"Я пытался с
@MockBean JobExplorer jobExplorer
но это бросает исключение:
Failed to load applicationContext,Caused by InstanceAlreadyExistsException
но он работает нормально, когда я запускаю его индивидуально. Так что я попытался использовать
@Mock JobExplorer jobExplorer;
public void setUp(){
MockitoAnnotations.init(this);
}
но этот даже не работает:(Тогда я добавил
@RunWith(MockitoJunitRunner.class)
@Configuartion(...)
class MockTest{
@Mock JobExplorer jobExplorer
public void setUp(){
MockitoAnnotations.init(this);
}
}
Основной код:
@RunWith(SpringRunner.class)
@Configuration(classes=TestConfig.class)
Class MockTest{
private static final String jobName ="job";
@Autowired JobLauncherTestUtils;
@Autowired JobRegistry jobRegistry;
@MockBean JobExplorer jobExplorer;
@Before
public void setUp(){
Job job = jobRegistry.getJob(jobName);
JobInstance jobInstance = new JobInstance(0L,job.getName());
JobExecution jobExecution = new JobExecution(0L);
jobExecution.setJobInstance(jobInstance);
}
@Test
public testMock(){
//jobParams
Data data = new Data();
ExecutionContext context = new ExecutionContext();
context.put("data",Data);
jobExecution.setExecutionContext(context);
when(jobExplorer.getJobExecution(any()).thenReturn(jobExecution);
JobExecution jobExecution = testUtils.launchStep("stepname",context);
}
@After
public void tearDown(){
//statements
}
1 ответ
Вы должны иметь в виду, что просто используя:
@Mock JobExecution jobExecution
public void setUp(){
MockitoAnnotations.init(this);
}
не вызывает внедрения этого макетированного экземпляра туда, где вы ожидаете его, или где он объявлен как переменная экземпляра.
Этот код в порядке, и вам не нужно использовать @RunWith(MockitoJunitRunner.class)
на нем.
Что вам нужно сделать, это ввести / установить jobExecution
экземпляр вручную в вашем @Test
или же @Before
метод.