我一直在编写一些REST API测试,我不知道我写的测试错误或我的POST方法无效。 我在执行测试时遇到此错误:
错误[2015-12-14 21:37:00,309] org.glassfish.grizzly.servlet.ServletHandler:服务异常: ! java.lang.NullPointerException:null ! at resources.ActorResource.postActor(ActorResource.java:31)...... etc
我不知道它来自哪里。测试中的Actor对象已正确初始化,所有这些都应该可以正常工作。
这是post方法:
@POST
@UnitOfWork
public Saying postActor(@HeaderParam("actorName") String name, @HeaderParam("actorBirthDate") String birthDate) {
Actor actor = dao.create(new Actor(name,birthDate));
return new Saying("Added : " + actor.toString());
}
这是我写的测试
@Test
public void postActor() {
when(movieDAO.create(actor)).thenReturn(actor);
final Response response = RULE.getJerseyTest().target("/actors").request().post(Entity.text(""));
assertThat(response.getStatusInfo().getStatusCode()).isEqualTo(Response.Status.OK.getStatusCode());
verify(movieDAO).create(actor);
}
修改 这是一个Actor初始化方法
@Before
public void setup() {
actor = new Actor();
actor.setId(1L);
actor.setBirthDate("12-03-2014");
actor.setName("Karol Marks");
}
和Actor类
@Entity
@Table(name="Actors")
public class Actor {
private long id;
private String name;
private String birthDate;
private Movie movie;
public Actor() {
}
public Actor(String name, String birthDate) {
this.name = name;
this.birthDate = birthDate;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Column(name = "name", nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "birthDate", nullable = false)
public String getBirthDate() {
return birthDate;
}
public void setBirthDate(String birthDate) {
this.birthDate = birthDate;
}
@ManyToOne(cascade = CascadeType.ALL)
public Movie getMovie() {
return movie;
}
public void setMovie(Movie movie) {
this.movie = movie;
}
@Override
public String toString() {
return "Actor{" +
"id=" + id +
", name='" + name + '\'' +
", birthDate='" + birthDate + '\'' +
'}';
}
答案 0 :(得分:2)
exception: ! java.lang.NullPointerException: null ! at resources.ActorResource.postActor(ActorResource.java:31) ...etc
表示Java源文件的第31行NullPointerException
中的代码抛出了ActorResource
。
您得到的是NullPointerException
,因为您的代码在运行时尝试调用对象上的方法,但该对象实际上是null
。
我无法看到ActorResource
的行号,然后
Actor actor = dao.create(new Actor(name,birthDate));
是ActorResource
的第31行,那么dao
必须是null
并且调用dao.create(…)
会导致NullPointerException
(这意味着{{ 1}}尚未初始化); dao
是return new Saying("Added : " + actor.toString());
的第31行,那么ActorResource
必须是actor
,并且调用null
会导致actor.toString()
(这意味着{ {1}}已返回NullPointerException
)。答案 1 :(得分:1)
您需要ArgumentMatcher
argThat,请参阅ArgumentMatcher:
when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
或者您必须覆盖equals
,请参阅Argument matchers:
使用复杂的参数匹配是合理的。使用
equals()
和偶尔anyX()
匹配器的自然匹配样式往往会提供干净的&简单的测试。有时,重构代码以允许equals()
匹配甚至实现equals()
方法以帮助进行测试更好。