Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Mockito验证是否使用包含子字符串的参数调用了方法_Java_Unit Testing_Mockito - Fatal编程技术网

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

Java 使用Mockito验证是否使用包含子字符串的参数调用了方法,java,unit-testing,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

调用
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());
ArgumentCaptor参数=ArgumentCaptor.forClass(String.class);
verify(logger,Mockito.times(1)).error(可选的.empty(),“HANDLE_EXCEPTION”,argument.capture());

在您的情况下,每次在
记录器上调用
error
方法时的所有参数都必须是
匹配器。下面是一个使用
匹配器
并模拟某个服务类的示例:

@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"));
    }
}
@ExtendWith(MockitoExtension.class)
公共类SomeTestClass{
私有静态类MyService{
公共无效错误(可选op、字符串msg1、字符串msg2){
}
}
@试验
void testMethod(){
MyService MyService=Mockito.mock(MyService.class);
myService.error(可选的.empty(),“这是错误”,“出现了一些错误”);
Mockito.verify(myService,Mockito.times(1)).error(Mockito.any(),Mockito.eq(“这是错误”),Mockito.contains(“错误”);
}
}
这里的
Mockito.any()
Mockito.eq()
Mockito.contains()
是返回匹配器的方法


要断言该方法是使用包含给定子字符串的
字符串调用的,请使用
Mockito.contains()
matcher。在这里,您可以找到有关使用的更多信息。

我不知道您发布的代码如何引发此异常,因为它没有使用任何匹配器。添加了一次尝试,我使用
ArgumentCaptor
错误地删除了该尝试。您是否阅读了错误消息?因为它非常清楚地解释了您需要做什么:所有参数都必须是匹配器。在详细的错误消息中,您不了解什么?