【问题标题】:How should I test this method with JUNIT and Mockito我应该如何用 JUNIT 和 Mockito 测试这个方法
【发布时间】:2020-08-04 09:29:40
【问题描述】:

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

    }

【问题讨论】:

    标签: java junit mocking mockito junit4


    【解决方案1】:

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

    listFilesService = new ListFilesService();
    

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

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

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

    然后致电MockitoAnnotations.initMocks(this)(阅读更多here)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多