我有一个场景,我从方法调用中收到一个列表,我想断言该列表包含正确的元素。一种方法是在每个元素中查找一些细节以查看要与哪个预期元素进行比较 - 例如。一个名字。然而,元素还包含一个随机生成的 UUID,我不关心比较。
然后我想一个测试工具可能会来救我。以下面的简化示例为例。
我有一个类狗:
public class Dog {
private String name;
private Integer age;
}
Run Code Online (Sandbox Code Playgroud)
它们包含在一个列表中:
List<Dog> dogs = ... many dogs
Run Code Online (Sandbox Code Playgroud)
现在我想测试该列表是否包含预期的狗,但由于某种原因我不知道某些字段 - 让我们说age. 我已经尝试过使用 assertj 和 hamcrest,但我找不到正确的解决方案,既可以比较两个列表,又可以忽略某些字段。
到目前为止,这就是我所拥有的(使用 hamcrest):
List<Dog> actualDogs = codeUndertest.findDogs(new Owner("Basti"));
List<Dog> expectedDogs = createExpectedListOfDogsWithoutTheAge();
Matcher.assertThat(actualDogs.get(0), Matcher.is(com.shazam.shazamcrest.matcher.Matchers
.sameBeanAs(expectedDogs.(0))
.ignoring("age")
))
Run Code Online (Sandbox Code Playgroud)
这有效,但它只比较 Dog 类的两个对象。我如何比较两个列表中的所有狗?
额外问题:如何在不知道顺序的情况下比较列表,或者我是否只需要断言预期的狗包含在列表中。
JodaTime有
public final class DateTime extends BaseDateTime {...}
Run Code Online (Sandbox Code Playgroud)
这是最直接的
public interface ReadableInstant extends Comparable<ReadableInstant>
Run Code Online (Sandbox Code Playgroud)
哈姆克雷斯特
public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<? super T>
greaterThan(T value) {...}
Run Code Online (Sandbox Code Playgroud)
如果我试试
greaterThan(new DateTime());
Run Code Online (Sandbox Code Playgroud)
然后我得到一个编译错误(Eclipse提供了最多的线索)
类型为Matchers的泛型方法greaterThan(T)不适用于参数(DateTime).推断类型DateTime不是有界参数的有效替代>
我是否正确地认为签名本greaterThan应该是
public static <T extends java.lang.Comparable<? super T>> org.hamcrest.Matcher<? super T>
greaterThan(T value)
Run Code Online (Sandbox Code Playgroud)
?是否有一种方法可以将这些组合在一起而不是原始的铸造Comparable?
hasProperty可用于hasItem检查给定属性的值,例如:
Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger"));
assertThat(names, hasItem(hasName));
Run Code Online (Sandbox Code Playgroud)
当name是属性时,这很好,即:有一个名为的方法getName().
是否有匹配器会检查不属于某个属性的方法?ie:在这种情况下,它将检查方法的返回值,name()而不是检查getName()集合中的项目.
我想使用hamcrest作为糖框架在if语句中使用,而不是在使用asserts的单元测试中,而是在原始生产代码中使用.
就像是
if ( isNotEmpty(name) ) return //....
Run Code Online (Sandbox Code Playgroud)
要么
if ( isEqual(name, "John")) return //...
Run Code Online (Sandbox Code Playgroud)
就像AssertThat没有抛出错误一样,只返回布尔值.可能吗?
我想比较两个双打阵列.使用vanilla JUnit,我可以这样做:
double[] a = new double[]{1.0, 2.0, 3.0};
double[] b = new double[]{1.0, 2.0, 3.0};
assertEquals(a, b, 1e-10);
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用Hamcrest,最好不要创建自定义匹配器(如果可能).类似于为数组中的每个元素使用"close"匹配器的东西.
我们有一个函数,它接受各种不同类型的输入:函数,字符串,编译的正则表达式,Hamcrest匹配器,并根据输入的类型适当地过滤列表.
我们目前正在使用isinstance(our_filter, hamcrest.matcher.Matcher),但这需要我们安装Hamcrest.
我们正在考虑使用字符串匹配inspect.getmro(type(POSSIBLE_MATCHER)); 但这感觉不洁净.import语句可能还有try/ except周围的选项.
什么是最好的方法?
在@dblslash的帮助下,这是迄今为止我所做的最好的:
[x.__module__+"."+x.__name__ for x in inspect.getmro(type(POSSIBLE_MATCHER))]
['hamcrest.core.core.isequal.IsEqual', 'hamcrest.core.base_matcher.BaseMatcher', 'hamcrest.core.matcher.Matcher', 'hamcrest.core.selfdescribing.SelfDescribing', '__builtin__.object']
我正在使用JUnit和Hamcrest编写单元测试.我一直在使用以下方法比较双值:
assertThat(result, is(0.5));
Run Code Online (Sandbox Code Playgroud)
但是,我现在需要比较计算值,我不想与完整的double值进行比较.相反,我想比较接近.
我发现了一个名为IsCloseTo但是我不确定如何使用它的类assertThat,我在网上找不到任何例子.
执行以下操作的正确语法是什么?
// I can't do this as I need to know what methods/classes whatever I should be using
// isCloseTo doesn't exist.
assertThat(result, isCloseTo(0.5, 0.1));
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个Hamcrest匹配器来单元测试返回java.util.Optional类型的方法.就像是:
@Test
public void get__Null(){
Optional<Element> element = Element.get(null);
assertThat( sasi , isEmptyOptional());
}
@Test
public void get__GetCode(){
Optional<Element> element = Element.get(MI_CODE);
assertThat( sasi , isOptionalThatMatches(allOf(hasproperty("code", MI_CODE),
hasProperty("id", notNullValue())));
}
Run Code Online (Sandbox Code Playgroud)
是否有任何可用的实现抛出Maven存储库?
包含的相反之处是什么?
List<String> list = Arrays.asList("b", "a", "c");
// should fail, because "d" is not in the list
expectedInList = new String[]{"a","b", "c", "d"};
Assert.assertThat(list, Matchers.contains(expectedInList));
// should fail, because a IS in the list
shouldNotBeInList = Arrays.asList("a","e", "f", "d");
Assert.assertThat(list, _does_not_contains_any_of_(shouldNotBeInList)));
Run Code Online (Sandbox Code Playgroud)
应该是_does_not_contains_any_of_什么?
我是新手使用hamcrest.当我发现如何使用它时,我一直怀疑何时使用is或equalTo.
有什么区别is和equalTo,虽然它在概念上还是ocasionally?它似乎行为相同.
Assert.assertThat(actual, equalTo("blue"));
Assert.assertThat(actual, is("red"));
Run Code Online (Sandbox Code Playgroud)
为什么你会使用一个而不是另一个?