当我尝试通过POST方法创建对象时,为什么会出现NullPointerException?

时间:2015-12-14 20:48:12

标签: java jersey dropwizard

我一直在编写一些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 + '\'' +
                '}';
    }

2 个答案:

答案 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}}尚未初始化);
  • 否则如果daoreturn 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()方法以帮助进行测试更好。