java - 使用 Mockito 验证是否使用包含子字符串的参数调用了方法

标签 java unit-testing 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());

最佳答案

在您的情况下,在 logger 上调用 error 方法的所有参数都需要是 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() 匹配器。您可以在此处找到有关使用 Matchers 的更多信息.

关于java - 使用 Mockito 验证是否使用包含子字符串的参数调用了方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55908664/

相关文章:

java - 在 Java 中保持单元测试隔离

java - Mockito:模拟具有多个构造函数的对象?

Java DAO 实现测试

Java类音频格式: Byte ordering

java - 如何从日历中获取月份中的某一天

java - 使用 gson 解析 JSON 文件,发生了一些奇怪的事情

java - Matcher 与 Object.equal?

java - android.database.sqlite.SQLiteDiskIOException

c# - 如何在 C# 中对算法进行单元测试?

java - 启动两个 Junit 测试套件