我应该如何使用 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
创建对象!
我是 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
创建对象!