Как мне протестировать этот метод с JUNIT и Mockito - PullRequest
1 голос
/ 04 августа 2020

Я новичок в модульном тестировании Junit и Mockito. Мне нужно выполнить модульное тестирование метода «processFiles (последняя папка с файлами)»

Когда я запускаю тест, я получаю исключение NullPointerException в «if (! This.studentService.isFileOk (data))».

Можете ли вы помочь мне понять, как я должен правильно тестировать этот метод. Заранее большое спасибо.

Это часть кода из метода processFiles:

@Stateless
public class ListFilesService{
 
  @EJB
  private transient StudentService studentService;
 
 public void processFiles(final File folder)
    {
        File[] fileNames = folder.listFiles();
        List<String> lines = new ArrayList<>();
        
        try
        {
                    List<String> l = readContent(file);
                    l.forEach(i -> lines.add(i));

            String[] data = lines.get(0).trim().split(";");
            if (!this.studentService.isFileOk(data))
            {
                LOG.warning(String.format("File not valid"));
            }
            else
            {
                studentService.storeStudents(lines);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

И вот как я пытаюсь протестировать свой метод processFile

 

public class TestCases
{
 
 
    @Mock
    ListFilesService listFilesService;
    
    @Mock
    public StudentService studentService;

    @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
 
 @Test
    public void testWrite2() throws IOException
    {

        final File tempFile1 = temporaryFolder.newFile("tempFile.txt");
        final File tempFile2 = temporaryFolder.newFile("tempFile2.txt");

        String[] data = {"LastName", "FirstName", "Age"};


        listFilesService = new ListFilesService();
        studentService = Mockito.mock(StudentService.class);
        when(studentService.isFileOk(eq(data))).thenReturn(true);


        FileUtils.writeStringToFile(tempFile1, "LastName;FirstName;Age" +
                "\nxxx1;nnnn1;15", "UTF-8");
        FileUtils.writeStringToFile(tempFile2, "LastName;FirstName;Age" +
                "\nxxx2;nnnn2;19", "UTF-8");


        listFilesService.processFiles(temporaryFolder.getRoot());

    }

1 Ответ

1 голос
/ 04 августа 2020

Вы создаете объект ListFilesService вручную, не позволяя Mockito внедрять макеты (в частности - studentService):

listFilesService = new ListFilesService();

При создании такого объекта поле studentService остается нулевым, потому что он никоим образом не инициализируется и вызывает сбой приложения с NullPointerException.

Что вы, вероятно, захотите сделать, так это запустить свой тестовый класс следующим образом:

@Mock
private StudentService studentService;
@InjectMocks
private ListFilesService listFilesService;

, а затем вызовите MockitoAnnotations.initMocks(this) (подробнее здесь ).

Инициализация макетов должна выполняться до запуска теста, поэтому лучше использовать метод настройки с аннотацией @Before (подробнее здесь ).

Не забудьте использовать поле listFilesService в вашем тесте и не создавать объект с помощью new!

...