我有一个方法调用,我想用mockito模拟。首先,我已经创建并注入了一个对象的实例,该方法将在其上被调用。我的目的是验证方法调用中的一个对象。
是否有一种方法,mockito允许您断言或验证对象和它的属性时,mock方法被调用?
例子
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
而不是做anyObject()我想检查参数对象包含一些特定的字段
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
如果使用Java 8,可以使用Lambda表达式进行匹配。
import java.util.Optional;
import java.util.function.Predicate;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
public class LambdaMatcher<T> extends BaseMatcher<T>
{
private final Predicate<T> matcher;
private final Optional<String> description;
public LambdaMatcher(Predicate<T> matcher)
{
this(matcher, null);
}
public LambdaMatcher(Predicate<T> matcher, String description)
{
this.matcher = matcher;
this.description = Optional.ofNullable(description);
}
@SuppressWarnings("unchecked")
@Override
public boolean matches(Object argument)
{
return matcher.test((T) argument);
}
@Override
public void describeTo(Description description)
{
this.description.ifPresent(description::appendText);
}
}
示例调用
@Test
public void canFindEmployee()
{
Employee employee = new Employee("John");
company.addEmployee(employee);
verify(mockedDal).registerEmployee(argThat(new LambdaMatcher<>(e -> e.getName()
.equals(employee.getName()))));
}
更多信息:http://source.coveo.com/2014/10/01/java8-mockito/
refEq的javadoc提到了相等性检查是浅的!你可以在下面的链接找到更多的细节:
https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html refEq (T) % 20以…)
当你使用其他没有实现.equals()方法的类时,“浅相等”问题无法控制,“DefaultMongoTypeMapper”类就是一个没有实现.equals()方法的例子。
support提供了一种方法,可以生成bean定义,而不是创建对象的实例,并且可以使用它来摆脱比较失败。
genericBeanDefinition(DefaultMongoTypeMapper.class)
.setScope(SCOPE_SINGLETON)
.setAutowireMode(AUTOWIRE_CONSTRUCTOR)
.setLazyInit(false)
.addConstructorArgValue(null)
.getBeanDefinition()
**“bean定义只是对bean的描述,而不是bean本身。
bean描述正确地实现了equals()和hashCode(),所以我们提供了一个定义,告诉spring应该如何创建一个DefaultMongoTypeMapper(),而不是创建一个新的DefaultMongoTypeMapper。”
在你的例子中,你可以这样做
Mockito.verify(mockedObject)
.doSoething(genericBeanDefinition(YourClass.class).setA("a")
.getBeanDefinition());