2017-03-09 38 views
1

下课后说我有一个Map<String, Action>,我是这样的:AssertJ - 继续用流利的断言检查

assertThat(spyActionMap.get("a")).isInstanceOf(Action.class); 

...通行证。现在,我要检查所获得的Action是正确的:

assertThat(spyActionMap.get("a")).isInstanceOf(Action.class).getValue(Action.NAME).isEqualTo("Go crazy"); 

...不能编译,这并不奇怪。有没有办法做这种事情?

+0

请提供一些更多的上下文类似'Action'类或至少它的相关部分。它有一个'getValue'方法吗?什么是“Action.NAME”? 你在做什么专门试验? – Riggs

+0

你只需要查找Javadoc来回答第一和第二个问题。你的第三个问题的答案是,我害怕:如果你需要问... –

+0

告诉我看看Javadoc暗示我,你可能意味着接口'javax.swing.Action',是吗?我发现它有一个静态字段'NAME',甚至一个'getValue'方法。如果你首先在你的问题中提供了这个信息(至少有一个标签),那将会很有帮助。 – Riggs

回答

1

你可以尝试isInstanceOfSatisfying并在Consumer指定断言:

Object yoda = new Jedi("Yoda", "Green"); 
Object luke = new Jedi("Luke Skywalker", "Green"); 

Consumer<Jedi> jediRequirements = jedi -> { 
    assertThat(jedi.getLightSaberColor()).isEqualTo("Green"); 
    assertThat(jedi.getName()).doesNotContain("Dark"); 
}; 

assertThat(yoda).isInstanceOfSatisfying(Jedi.class, jediRequirements); 
assertThat(luke).isInstanceOfSatisfying(Jedi.class, jediRequirements); 
+0

谢谢......作为AssertJ背后的主要人物之一,如果'isInstanceOf'(以及类似的方法)返回的'Assert'接口不能以某种方式将其与检查的实例“交换”它投向有问题的班级?你给出的解决方案说明了在AssertJ工具箱中使用一个更有用的工具......但它可能不是最理想的“流利”(显然,我不知道设计我的想法是多么困难......!) –

+0

由于Java的泛型限制,不幸的是不可能的,这已经在https://github.com/joel-costigliola/assertj-core/issues/683中进行了讨论,这导致了“isInstanceOfSatisfying”解决方案。 –