使用 Mockito 验证使用包含子字符串的参数调用方法

当logger.error被调用时,有许多不同的东西可以作为第三个参数传递。


如何验证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());


叮当猫咪
浏览 119回答 1
1回答

鸿蒙传说

error在调用该方法期间的所有参数都logger需要matchers在您的情况下。这是一个使用matchers和模拟一些服务类的例子:@ExtendWith(MockitoExtension.class)public class SomeTestClass {&nbsp; &nbsp; private static class MyService {&nbsp; &nbsp; &nbsp; &nbsp; public void error(Optional<String> op, String msg1, String msg2) {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Test&nbsp; &nbsp; void testMethod() {&nbsp; &nbsp; &nbsp; &nbsp; MyService myService = Mockito.mock(MyService.class);&nbsp; &nbsp; &nbsp; &nbsp; myService.error(Optional.empty(), "This is error", "Some error appeared");&nbsp; &nbsp; &nbsp; &nbsp; Mockito.verify(myService, Mockito.times(1)).error(Mockito.any(), Mockito.eq("This is error"), Mockito.contains("error"));&nbsp; &nbsp; }}这里Mockito.any(), Mockito.eq(),Mockito.contains()是返回匹配器的方法。要断言该方法是通过String包含给定子字符串调用的,请使用Mockito.contains()匹配器。在这里您可以找到有关使用Matchers的更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java