java - 为什么当我返回模拟值时会收到 NullPointerException?

标签 java junit mockito

我有一个类:

public CustomerService Implements custStruct {

    public Service changeCustomer(Guest guest) {
    ...

    Seats seat = custService.assignSeats(tickets);

    if(!seat.full) { // <--- this line is giving Null Pointer (seat is null)
     ...do something
    }
   }

我的测试是这样写的:

// ...
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        customerService = new CustomerService();
        customerService = Mockito.spy(customerService);
    }
// ...
@Test
public void testAssignSeats(){
    Guest guest = Mockito.mock(Guest.class);
    Seat seat = Mockito.mock(SeatCalc.class);
    Tickets tickets = Mockito.mock(Tickets.class);
    CustService custService = Mockito.mock(CustService.class);

    customerService.set(tickets); //tickets is a setter
    customerService.set(custService); //set to use another class's method
    Mockito.when(custService.assignSeats(tickets)).thenReturn(seat);

// ...
    customerService.changeCustomer(guest);
}

我想知道是否有办法在 if 语句上 stub 值?如果我尝试 stub seat 它将如何工作?

编辑:添加了有关座位等级的更多信息 下面是 Seat 类...

public class Seat{
    public boolean full= false;
    public SeatArrangeRequest seatArrangeReq;
    public List<ArrangeOrder> arrangeOrderList;
}

这是从...调用的 custService 方法

public seats custService(Tickets tickets) {

if(tickets!= null) {
    ...do some algorithm...
    return seats
}

    seat.full = true;
    return seat;
}

最佳答案

发生了两件事之一,我不完全确定您的 MCVE 与您的真实代码相匹配。它是以下之一:

  1. 您正在尝试访问模拟对象的实例字段。相反,请使用真实的对象(如果 Seat 只是 POJO ),或定义一个可以模拟的 getter (seat.isFull())。
  2. 测试中的tickets与您在CustomerService中使用的tickets对象不匹配。您可以使用 Argument Matcher 来解决此问题,它将匹配任何 Tickets 对象,例如

    customerService.set(tickets); //tickets is a setter
    customerService.set(custService); //set to use another class's 
    methodMockito.when(custService.assignSeats(Mockito.any(Tickets.class))).thenReturn(seat);
    

如果这些都不能解决您的问题,那么请edit您的问题可以更准确地反射(reflect)您真正在做什么。

关于java - 为什么当我返回模拟值时会收到 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189260/

相关文章:

java - 如何动态更改警报文本?

java - 请帮助 :Grid of JButtons in a JPanel shows one JButton instead of 400 when GridLayout(20, 20) 使用

java - 具有递归 Map 的 Hadoop MapReduce

java - 我该如何解决有关 TestNG 和 Spring Boot 的问题

java - Swing - 使用 getComponent() 更新所有 JButton

maven - 如何在 Maven 依赖项中使用 JUnit 5.2 BOM?

java - assertEqual NullPointerException 的 JUnit 测试

unit-testing - 了解如何使用 Mockito doReturn/when 对返回类型为 void 的方法进行 JUnit 测试

java - Mockito - 当... then通过传递期望值列表多次返回

Android Mockito kotlin.UninitializedPropertyAccessException : lateinit property dataManager has not been initialized