在模拟对象上调用的方法的 Mockito NullPointer 异常

Mockito NullPointer Exception for the method called on Mock Object

当第一次调用 when(creditApplicationCache.getObject("")).thenRetun(response) 时,我遇到了 NPE。 creditApplicationCache 为空。

  1. 我正在使用 mockito 2。17.jar。
  2. 我添加了@RunWith(MockitoJUnitRunner.class).
  3. 我也尝试过 MockitoAnnotations.initMocks(this)。

但没有任何帮助。 CreditApplicationCache 未初始化。

@RunWith(MockitoJUnitRunner.class)
public class WebServiceClientTest {
    
    @InjectMocks
    WebServiceClientImpl webServiceClientImpl;
    
    @Mock
    private ApplicationCacheImpl creditApplicationCache;
        
    /*@Before
    public void setUp()  {
        MockitoAnnotations.initMocks(this);
    }*/

    @Test
    public void testWebServiceClient() throws BusinessException, SystemException {
        WebServiceClientImpl webServiceClientImpl = new WebServiceClientImpl();         
        
        CreditCardDetailsResponse creditCardDetailsResponse = new CreditCardDetailsResponse();
        creditCardDetailsResponse.setAccountNumber("1234567");
        
when(creditApplicationCache.getObject("XXXXXXX")).thenReturn(creditCardDetailsResponse);         
 when(webServiceClientImpl.getCreditCardDetails("1234")).thenReturn(creditCardDetailsResponse);
        CreditCardDetailsResponse mockResponse = webServiceClientImpl.getCreditCardDetails("1234");
            
        assertEquals(creditCardDetailsResponse.toString(),mockResponse.toString());             
    }
}
---------------------------------------------------------------------------------------------------------
WebServiceClientImpl.java

public class WebServiceClientImpl implements WebServiceClient {
@Autowired
private ApplicationCache creditApplicationCache;

public CreditCardDetailsResponse getCreditCardDetails(String id)
            throws BusinessException, SystemException {
        // Some Code
    CreditCardDetailsResponse response = null;
        
        response = (CreditCardDetailsResponse) creditApplicationCache.getObject(cacheKey);
        if (response == null) {
            try {
             // More Code }
    return response ;

  }
}

当您从 org.junit.jupiter.api.Test 而不是 org.junit.Test 导入 @Test 时,可能会出现此问题。您能确保您使用的是正确的 @Test 注释吗?

您的问题是您在测试的第一行再次创建客户端:WebServiceClientImpl webServiceClientImpl = new WebServiceClientImpl();

@InjectMocks 已经构建了带注释的 class,并注入了所有相关的模拟,但是您所做的是 re-create 它没有它,因此是 NPE。

只需删除该行即可