Из показанного тестового кода созданное вручную хранилище не внедряется в тестируемый объект, поэтому оно является нулевым и вызывает NPE
Поскольку при использовании @Autowired
вам также необходимо выполнитьубедитесь, что зависимость должным образом помечена для имитации
@Mock
private WorkJobRepository workJobRepository;
@InjectMocks
private ReadWorkJob readWorkJob;
@Before
public void setUp() throws Exception {
when(workJobRepository.findById(any())).thenReturn(null);
logger.info("check point test case setup");
}
После этого тест должен вести себя так, как ожидалось.
Когда зависимость была создана вручную, она не будет внедрена в объект вtest.
Другой подход заключается в том, чтобы подчиненный класс следовал принципу явной зависимости
public class ReadWorkJob {
private WorkJobRepository workJobRepository;
@Autowired
public ReadWorkJob (WorkJobRepository workJobRepository) {
this.workJobRepository = workJobRepository;
}
public void writeNewIdData(JSONObject jsonObject) {
WorkJob workJob = getExistingId(jsonObject.get("id").toString());
}
private WorkJob getExistingId(String id) {
logger.info("check point ppppp");
WorkJob workJob = workJobRepository.findById(id);
logger.info("check point qqqqq");
return workJob != null ? workJob : new WorkJob();
}
}
и соответствующим образом рефакторинг теста
@RunWith(MockitoJUnitRunner.class)
public class ReadWorkJobTest {
private static final String RIGHT_DATA_FILE_NAME = "test.txt";
private ReadWorkJob readWorkJob;
private WorkJobRepository workJobRepository;
@Before
public void setUp() throws Exception {
workJobRepository = Mockito.mock(WorkJobRepository.class);
when(workJobRepository.findById(any())).thenReturn(null);
readWorkJob = new ReadWorkJob(workJobRepository); //<--
logger.info("check point test case setup");
}
@Test
public void testNewIdDBWriter() throws Exception {
logger.info("check point test case 1");
readWorkJob.writeNewIdData(getRightData());
logger.info(("check point test case 2"));
}
private JSONObject getRightData() throws IOException {
String rightDataString = new String(Files.readAllBytes(Paths.get(RIGHT_DATA_FILE_NAME)));
JSONObject jsonObject = new JSONObject(rightDataString);
return jsonObject;
}
}