简体   繁体   English

使用 PowerMockito 时出现 NullPointerException

[英]NullPointerException while using PowerMockito

getting null pointer exception while mocking getTimeZone method.获取 null 指针异常,而 mocking getTimeZone 方法。 defaultSystemTimezone is populated from property file. defaultSystemTimezone 是从属性文件中填充的。

SummaryServiceTest.java: 

@RunWith(PowerMockRunner.class)
@PrepareForTest({Calendar.class, TimeZone.class})
@ExtendWith(SpringExtension.class)
class SummaryServiceTest{

    @Mock
    BookingRepository bookingRepository;
    
    @InjectMocks
    private SummaryService summaryService;

    @Before
    public void setup(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getBookingRejections() throws Exception {
        TimeZone timezoneObj = TimeZone.getTimeZone("America/Cambridge_Bay");
        PowerMockito.mockStatic(TimeZone.class);
        Mockito.when(TimeZone.getTimeZone(eq("America/Cambridge_Bay"))).thenReturn(timezoneObj);
        Calendar calendar1 = Calendar.getInstance(TimeZone.getDefault(), Locale.US);
        Calendar ac = PowerMockito.mock(Calendar.class);
        PowerMockito.doReturn(calendar1).when(ac , "getInstance");
        Boolean bookingRejectionsByWeekForCarrierList = summaryService.getBookingRejections();
    }
}

SummaryService.java:

@Service
public class SummaryService {

    @Autowired
    private BookingRepository bookingRepository;
    
    @Value("${timezone.default}")
    private String defaultSystemTimezone;
    
    public Boolean getBookingRejections() {
            Calendar calendarFirstDayOfWeek = Calendar.getInstance(TimeZone.getTimeZone(defaultSystemTimezone), Locale.US);
            return true;
        }
    }
    
application.properties:

    timezone.default=America/Cambridge_Bay
    

getting below exception:得到以下异常:

java.lang.NullPointerException
    at java.util.TimeZone.parseCustomTimeZone(TimeZone.java:783)
    at java.util.TimeZone.getTimeZone(TimeZone.java:562)
    at java.util.TimeZone.getTimeZone(TimeZone.java:516)
    at com.booking.service.SummaryServiceTest.getBookingRejections(SummayServiceTest.java:)
    

not able to exact problem even TimeZone is mocked.即使 TimeZone 被嘲笑,也无法准确解决问题。 here trying to get calendar object.这里试图获取日历 object。

resolved the problem by adding setter for defaultSystemTimezone variable of SummaryService.通过为 SummaryService 的 defaultSystemTimezone 变量添加 setter 解决了该问题。 and set the value of var in test method.并在测试方法中设置 var 的值。

SummaryService.java:

@Service
public class SummaryService {

    @Autowired
    private BookingRepository bookingRepository;
    
    @Setter
    @Value("${timezone.default}")
    private String defaultSystemTimezone;
    
    public Boolean getBookingRejections() {
            Calendar calendarFirstDayOfWeek = Calendar.getInstance(TimeZone.getTimeZone(defaultSystemTimezone), Locale.US);
            return true;
        }
    }

    @Test
        public void getBookingRejections() throws Exception {
            summaryService.setDefaultSystemTimezone("America/Cambridge_Bay");
            //execute test
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM