带有 returns 布尔值的方法的 Mockito 不被我的代码考虑

Mockito with method which returns a boolean is not considered by my code

在我的 Java 代码中,我想用 Mockito 模拟一个 return 布尔值的方法。 事实上,它涉及计算停车价格的停车应用程序。在我使用 Junit5 和 Mockito 进行的测试中,我模拟了一个方法,其中 return 一个布尔值,如果此布尔值为真,则使用 reduce 计算价格。但是我的模拟不起作用,我不知道为什么...

when(ticketDao.isRegularCustomer(any(String.class))).thenReturn(true);

我希望这个模拟可以计算降价的价格。 感谢您的帮助,这是我的代码。

    @ExtendWith(MockitoExtension.class)
    public class FareCalculatorServiceTest {

    private static FareCalculatorService fareCalculatorService;
    private Ticket ticket;

    @Mock
    private static TicketDao ticketDao;

    @BeforeAll
    private static void setUp() {
        fareCalculatorService = new FareCalculatorService();

    }

    @BeforeEach
    private void setUpPerTest() {
        ticket = new Ticket();
        //when(ticketDao.isRegularCustomer(any())).thenReturn(false);
    }


    @Test
    public void feature2CalculateFareBikeWith5PerCentReduceIfRegularCustomer(){
        Date inTime = new Date();
        inTime.setTime( System.currentTimeMillis() - (45 * 60 * 1000) );//45MIN IN PARKING
        Date outTime = new Date();
        ParkingSpot parkingSpot = new ParkingSpot(1, ParkingType.BIKE,false);

        when(ticketDao.isRegularCustomer(any(String.class))).thenReturn(true);

        ticket.setInTime(inTime);
        ticket.setOutTime(outTime);
        ticket.setParkingSpot(parkingSpot);

        fareCalculatorService.calculateFare(ticket); 

        assertEquals((0.75 * Fare.BIKE_RATE_PER_HOUR-((0.75 * Fare.BIKE_RATE_PER_HOUR) * 5/100)), ticket.getPrice());
    }

这是正在测试的代码

public void calculateFare(Ticket ticket) {

    //resultTime is used to calculate parking's cost.
    float resultTime;

    if ((ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime()))) {
      throw new IllegalArgumentException("Out time provided is incorrect:" + ticket.getOutTime().toString());
    }

    long inHour = ticket.getInTime().getTime();
    long outHour = ticket.getOutTime().getTime();
    //TODO: Some tests are failing here. Need to check if this logic is correct
    long duration = outHour - inHour;

    if (duration < ((30 * 60 * 1000))) {
      resultTime = 0; //if duration is less than 30min, the cost is free for customer and result time is automatically set at 0.
    } else {
      resultTime = ((((float) duration / 1000) / 60) / 60);
    }

    if (ticketDao.isRegularCustomer(ticket.getVehicleRegNumber())) {
      System.out.println("----------------------------------------");
      System.out.println(" ----- 5% REDUCE ON OVERALL COST -----");
      System.out.println("----------------------------------------");

      switch (ticket.getParkingSpot().getParkingType()) {
        case CAR: {
          ticket.setPrice((resultTime * Fare.CAR_RATE_PER_HOUR) - ((resultTime * Fare.CAR_RATE_PER_HOUR) * 5 / 100));
          System.out.println(ticket.getPrice());
          break;
        }
        case BIKE: {
          ticket.setPrice((resultTime * Fare.BIKE_RATE_PER_HOUR) - ((resultTime * Fare.BIKE_RATE_PER_HOUR) * 5 / 100));
          System.out.println(ticket.getPrice());
          break;
        }
        default:
          throw new IllegalArgumentException("Unknown Parking Type");
      }

    } else {
      switch (ticket.getParkingSpot().getParkingType()) {
        case CAR: {
          ticket.setPrice(resultTime * Fare.CAR_RATE_PER_HOUR);
          System.out.println(resultTime * Fare.CAR_RATE_PER_HOUR);
          break;
        }
        case BIKE: {
          ticket.setPrice(resultTime * Fare.BIKE_RATE_PER_HOUR);
          System.out.println(resultTime * Fare.BIKE_RATE_PER_HOUR);
          break;
        }
        default:
          throw new IllegalArgumentException("Unknown Parking Type");
      }
    }
  }
}

您必须将 ticketDao 的模拟设置到 fareCalculatorService 中:

  • 使用 setter(在您的方法或 @Before 方法中)
  • 在您测试的 fareCalculatorService 声明中使用 @InjectMocks 注释 class

像那样:

@InjectMocks
private static FareCalculatorService fareCalculatorService;

如果你这样做,你将不得不删除你的@BeforeAll 方法。