java - 使用 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());
解决方案
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()
匹配器。在这里您可以找到有关使用Matchers的更多信息。
推荐阅读
- c# - 带有谷歌驱动 API OAuth 2.0 的 Asp.net MVC 在生产中不起作用
- java - 我如何将json映射到java中
- c++ - C++ 结构错误“调用‘擦除’没有匹配函数
- hibernate - 为非 id 字段制作自定义 JPA Hibernate 序列
- redirect - 在 EasyAdmin Bundle 中为特定角色禁用实体/重定向
- c - LuaJIT FFI 不从可执行文件加载符号
- ios - 当点击collectionView单元格内的按钮时,如何从tableViewCell内的collectionView获取表视图行并推送到viewController
- sublimetext3 - 如何使用德语键盘注释代码块
- html - 让不同 div 中的两个段落对齐
- terminal - 在终端(Ubuntu)中仅显示请求的包(apt、apt-get、dpkg)