Как мне издеваться над локальным OAuth2RestTemplate restTemplate? - PullRequest
1 голос
/ 07 февраля 2020

У меня есть метод:

public void putObj(Doc doc) {
        for (int i = 0; i < 3; i++) {
            try {
                OAuth2RestTemplate restTemplate = something.thatReturnsOAuth2RestTemplate(props);
                restTemplate.postForEntity(somethingElse.getUrl(), doc.toJSONString(), String.class);
                break;
            } catch (HttpClientErrorException | HttpServerErrorException e) {
                //do stuff in here
            }
        }
    }

И мой тестовый класс:

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest(OkHttp3TemplateUtil.class)
public class TestingClass {

@InjectMocks
private static MyService myService;

@Mock
private static Something something;

@Mock
private static Props props;

@Mock
private static OAuth2RestTemplate restTemplate;

@Test
    public void testExceptionCaughtWhenThrownByRestTemplate(){
        PowerMockito.mockStatic(OkHttp3TemplateUtil.class);
        Doc doc = new Doc.docBuilder().setSomething("");

        when(something.thatReturnsOAuth2RestTemplate(props)).thenReturn(restTemplate);
        when(restTemplate.postForEntity("http://dummy.com", String.class, String.class)).thenThrow(HttpClientErrorException.class);
        myService.putObj(doc);
    }
}

Независимо от того, что я делаю, thenThrow никогда не вызывает исключение. Тест не проходит, не предоставляя покрытие для кода после catch. Что мне здесь не хватает, я схожу с ума!

1 Ответ

2 голосов
/ 07 февраля 2020

Похоже, вам нужно использовать спички от Mockito.

В вашем случае 3 аргумента для restTemplate немного сбивают с толку. Первым является значение String, поэтому используйте anyString(), чтобы сопоставить его, и смоделируйте somethingElse.getUrl(), этот код отсутствует в примере, поэтому не уверен, что он делает, но он должен вернуть String, а не быть null. Похоже, вы хотите сопоставить любую строку для 2-го, с Mockito вам нужно использовать anyString() или any(), если это не String для достижения sh. Третье - фактическое значение String.class, поэтому снова используйте eq(). Обратите внимание, что если какие-либо параметры равны нулю, они не будут совпадать. Кроме того, легко в конечном итоге издеваться над другой перегруженной postForEntity, если вы не будете осторожны.

Для something.thatReturnsOAuth2RestTemplate вы можете быть в порядке без соответствия. Если класс Props имеет равные, и значения тестового и рабочего кодов равны. Однако, пример не показывает эту информацию, поэтому я просто добавил any(Props.class) для этого тоже.

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;

@Test
    public void testExceptionCaughtWhenThrownByRestTemplate(){
        PowerMockito.mockStatic(OkHttp3TemplateUtil.class);
        Doc doc = new Doc.docBuilder().setSomething("");

                when(something.thatReturnsOAuth2RestTemplate(any(Props.class))).thenReturn(restTemplate);
        when(restTemplate.postForEntity(anyString(), any(), eq(String.class))).thenReturn(response);
}
...