【问题标题】:Junit with lambdas and stream mapJunit 与 lambdas 和流图
【发布时间】:2021-02-22 12:19:55
【问题描述】:

我有以下方法和 Junit 用于我需要为其编写 Junit 的方法。

Employee POJO 类看起来像

public class Employee {
    
    String id ;
    
    Department department; //another simple pojo class

Junit 失败并出现以下 NPE 错误 s.getDepartment() 评估为 null。我该如何避免它

java.lang.NullPointerException
  at com.example.mockito.TodoService.lambda$0(TodoService.java:47)
  at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
void fetch(String date)

    {
          List<Employee> employeeList = todoRepository.call(date);
        
        employeeList=   employeeList
        .stream()
        .map(s -> { 
            
            System.out.println("in here map s.getDepartment() "  + s.getDepartment());//prints null in junit
            s.getDepartment().setDeptName("CSE");
        
        return s;
        } ).collect(Collectors.toList());

下面是Junit

@ExtendWith(MockitoExtension.class)
public class TodoServiceTest {

    @InjectMocks
    private TodoService todoService;

    @Mock
    private TodoRepository todoRepository;



    private List<TodosObject> actualList;


    
    
    
    @Test
    public void  lambda() {
        String date = "2021";
        List<Employee> list = new ArrayList<>();
        Employee e = new Employee();
        list.add(e);


        when(todoRepository.call(date)).thenReturn(list);

        todoService.fetch(date);

}

【问题讨论】:

  • 在您提供的 POJO 中,您似乎没有创建 getter/setter。您是否无论如何创建这些并使用它们来设置员工的价值观?否则 NPE 是合乎逻辑的。
  • 为简洁起见,我在示例中创建了刚刚省略的示例。@Wouter van der Linde 给出的答案解决了问题

标签: java unit-testing junit mocking


【解决方案1】:

需要在lambda()方法中设置Department的值。

lambda() 你这样做:

List<Employee> list = new ArrayList<>();
Employee e = new Employee();
list.add(e);

不设置 Department 的值。然后在 fetch() 中执行 s.getDepartment().setDeptName("CSE"); 会产生 NPE。

您要么需要在 lambda() 方法中设置部门(例如 e.setDepartment(new Department()) 或类似的东西),要么在 fetch() 方法中检查 null,具体取决于您的用例。 (例如,department 在生产中可以为空吗?)

【讨论】:

  • 感谢在我的示例中添加 e.setDepartment(new Department( )) 工作可以模拟流..假设它正在调用某些 DAO 方法
  • 太棒了,很高兴听到。 :) 你是对的。尝试模拟 Stream 是个坏主意。只是为了进一步扩展该主题:通常,您希望在测试中设置“有效”且具有已知值的 POJO,以便您可以验证您的方法是否按预期工作。 (在这种情况下,部门名称更改为“CSE”。)
  • 好的,谢谢。我会将您的答案标记为正确
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多