Используя Mockito, убедитесь, что метод был вызван с аргументом, содержащим подстроку - PullRequest
2 голосов
/ 29 апреля 2019

Когда вызывается logger.error, есть много разных вещей, которые могут быть переданы в качестве 3-го аргумента.

Как проверить, что e содержит определенную подстроку?

Этомой рабочий код ..

public class MyClass {

    private ILogger logger = Slf4jLogbackLogger
            .generateLogger(MyClass.class.getClassLoader().getResource("log_messages.properties"));

    public void doSomething() {
        logger.info(Optional.empty(), "MyClass.doSomething");

        try {
            .. do things // throw new RuntimeException("something");

        } catch (Exception e) {
            logger.error(Optional.empty(), "HANDLE_EXCEPTION", e);
        }
    }
}

Мой тестовый код ..

@RunWith(MockitoJUnitRunner.class)
public class TestMyClass {

    @Mock
    private ILogger logger;

    @InjectMocks
    @Spy
    private MyClass myClass = new MyClass();

    @Before
    public void init() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMyClass() throws Exception {

        try {
            myClass.doSomething();
        } catch (Exception e) {
            fail("Should not have thrown any exceptions");
        }
        Mockito.verify(logger, Mockito.times(1)).error(Optional.empty(), "HANDLE_EXCEPTION", "Contains something specific");
    }
}

Это ошибка, которую я получаю ..

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
3 matchers expected, 1 recorded:

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

Попробовалтакие вещи, как ниже, но та же ошибка:

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
Mockito.verify(logger, Mockito.times(1)).error(Optional.empty(), "HANDLE_EXCEPTION", argument.capture());

1 Ответ

3 голосов
/ 29 апреля 2019

Все аргументы во время проверки того, что метод error был вызван для logger, должны быть matchers в вашем случае. Вот пример использования matchers и насмешки над некоторым классом обслуживания:

@ExtendWith(MockitoExtension.class)
public class SomeTestClass {

    private static class MyService {
        public void error(Optional<String> op, String msg1, String msg2) {

        }
    }

    @Test
    void testMethod() {
        MyService myService = Mockito.mock(MyService.class);
        myService.error(Optional.empty(), "This is error", "Some error appeared");
        Mockito.verify(myService, Mockito.times(1)).error(Mockito.any(), Mockito.eq("This is error"), Mockito.contains("error"));
    }
}

Здесь Mockito.any(), Mockito.eq(), Mockito.contains() - это методы, которые возвращают совпадения.

Чтобы утверждать, что метод был вызван с String, содержащим данную подстроку, используйте Mockito.contains() matcher. Здесь вы можете найти более подробную информацию об использовании Matchers .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...