我应该如何使用 JUNIT 和 Mockito 测试此方法

How should I test this method with JUNIT and Mockito

我是 Junit 和 Mockito 单元测试的新手。我需要对方法“processFiles(final File folder)”

进行单元测试

当我 运行 测试时,我在“if (!this.studentService.isFileOk(data))”处收到 NullPointerException。

你能帮我看看我应该如何正确地测试这个方法吗?非常感谢。

这是 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());

    }

您正在手动创建 ListFilesService 对象,而不是让 Mockito 注入模拟(具体来说 - studentService):

listFilesService = new ListFilesService();

像这样创建对象时,字段 studentService 保持为空,因为它没有以任何方式初始化并且它导致应用程序失败 NullPointerException

您可能想要做的是像这样开始您的测试class:

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

然后调用 MockitoAnnotations.initMocks(this)(阅读更多 here)。

模拟初始化应该在测试运行之前完成,因此最好使用带有 @Before 注释的设置方法(阅读更多 here)。

请记住在测试中使用 listFilesService 字段,而不是通过 new 创建对象!