我认为第一个值得说的是,像这样测试类内部不是一个好主意,除非在非常特殊的情况下。您的测试将是脆弱的,通常完全安全的更改(即重命名字段)现在可能会导致自动生成失败。你应该测试
外部行为
,而不是实现细节。
看来你最好执行
equals
和
hashCode
在你们班
A
,那么您可以简单地执行以下操作:
contains(new A(1))
如果你确实有充分的理由这样做(这种情况很少见),那么你就不能使用
hasProperty
为此。
从
the JavaDoc
:
创建匹配被检查对象具有JavaBean时的匹配器
具有指定名称的属性,其值满足指定的
匹配器。
我相信这意味着你需要一个名为
getX
.
您不应该仅仅为了测试的目的而添加这样的方法,但是您可以编写自己的通用方法。
Matcher
将使用反射来检查类字段的实现。
下面是一个示例实现:
class ReflectiveFieldMatcher<T> extends BaseMatcher<Object>
{
private final String fieldName;
private final T expectedValue;
ReflectiveFieldMatcher(final String fieldName, final T expectedValue)
{
this.fieldName = fieldName;
this.expectedValue = expectedValue;
}
@Override
public boolean matches(final Object obj)
{
for (final Field field : obj.getClass().getFields())
{
if (field.getName().equals(fieldName))
{
field.setAccessible(true);
try
{
Object value = field.get(obj);
return expectedValue.equals(value);
}
catch (final IllegalAccessException e)
{
throw new RuntimeException(e);
}
}
}
return false;
}
@Override
public void describeTo(final Description description)
{
description.appendText("Object with field '" + fieldName + "' with value: " + expectedValue);
}
}
您的示例如下所示:
assertThat(result, contains(new ReflectiveFieldMatcher<>("x", 1)));