Итак, во-первых, вы пытаетесь получить пустое значение из вашего JsonMap:
@Test
public void checkUpdateTest(){
String strToken = "";
.
.
.
when(getEndpointRes.getAttributes().get(strToken)).thenReturn("");
// so what you ask here is this:
when(getEndpointRes.getAttributes().get("")).thenReturn("");
// this should probably be "Token"
when(getEndpointRes.getAttributes().get("Token")).thenReturn("");
}
следующее: JsonMap - это реальный объект, а не насмешка, поэтому вы не Вам не нужно вызывать when(getEndpointRes.getAttributes().get(strToken)).thenReturn("");
, так как ваш jsonmap будет возвращать правильное значение.
тогда, этот вызов не нужен, так как ваш getEndpointRes является ложным. Вот почему вы используете синтаксис when (). ThenX ()
getEndpointRes.setAttributes(jsonBody);
Чтобы решить проблему NPE, попробуйте следующее:
// imports...
@Tested
AmazonSNSRegistrationService service= new AmazonSNSRegistrationService();
@Test
public void checkUpdateTest(){
// directly mock the amazonsns here
AmazonSNS amazonSNS = mock(AmazonSNS.class);
service.amazonSNS = amazonSNS;
String pushToken = "dxbv1fwJYIo";
String endPointArn = "";
// maybe mock them aswell
Map<String, String> jsonBody = new HashMap<String, String>();
jsonBody.put("Token", "");
jsonBody.put("enabled", "");
// deleted the mocked request. You don't need it in this case as your service contructs it by itself
GetEndpointAttributesResultgetEndpointRes getEndpointRes = mock(GetEndpointAttributesResult.class);
getEndpointRes.setAttributes(jsonBody);
// directly use the mocked object and react on any() as getEntpointReq never will be present in your service!
when(amazonSNS.getEndpointAttributes(any())).thenReturn(getEndpointRes);
when(getEndpointRes.getAttributes()).thenReturn(jsonBody);
amazonSNSRegistrationService.checkUpdate(pushToken, endPointArn);
// do some further assertments
}
Кажется, вы пытаетесь высмеивать вещи, которые вы не нужно насмехаться над тем, что генерируется в вашем сервисе. Если вы когда-либо сталкивались с NPE в классах, которые вы пытаетесь протестировать, вы должны правильно отладить свой тест. В вашем случае насмешка кажется неправильной, и, следовательно, вызовы реальных объектов приводят к NPE
Во втором примере кажется, что та же проблема. вы пытаетесь вернуть что-то из макета, который, вероятно, создан внутри вашего amazonSNSRegistrationService
. Как ваш смоделированный deleteEndpointReq
должен вернуть любое значение, если оно не является частью класса? Вы просто создаете макет, но это не тот же объект, который создается внутри вашего сервиса!
И в конце концов вам следует добавить некоторые утверждения. Тесты, которые я вижу здесь, терпят неудачу, только если тестируемый класс завершается с ошибкой, как в вашем случае. Но некоторые основные утверждения c отсутствуют. Я лично использую AAA шаблон для модульных тестов.