2015-12-14 79 views
0

我一直在編寫一些REST API測試,我不知道我是否寫錯了我的測試,或者我的POST方法是無效的。 林收到這個錯誤,當我執行測試:當我嘗試通過POST方法創建對象時,爲什麼會得到NullPointerException?

ERROR [2015年12月14日21:37:00309] org.glassfish.grizzly.servlet.ServletHandler:服務異常: ! java.lang.NullPointerException:null ! atResources.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); 
    } 

編輯 Here`s演員初始化方法

@Before 
    public void setup() { 
     actor = new Actor(); 
     actor.setId(1L); 
     actor.setBirthDate("12-03-2014"); 
     actor.setName("Karol Marks"); 
    } 

和演員類

@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

I've加入了一些男主角的細節,我填寫所有被要求「的toString()」方法 – VanDavv

+0

的字段,因爲它是在資源 – VanDavv

回答

1

你需要一個像ArgumentMatcherargThat,看到ArgumentMatcher

when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true); 

,或者你必須覆蓋equals,看到Argument matchers

要利用複雜的參數匹配合理。使用equals()和偶爾anyX()匹配的自然匹配樣式傾向於給出簡單測試的清潔&。有時候重構代碼以允許equals()匹配甚至實施equals()方法來幫助進行測試更好。

2

exception: ! java.lang.NullPointerException: null ! at resources.ActorResource.postActor(ActorResource.java:31) ...etc意味着一個NullPointerException由代碼在ActorResource拋出,Java源文件的線31。

你得到一個NullPointerException,因爲你的代碼在運行時試圖調用一個對象的方法,但實際上對象是null

正如我看不到的行號爲ActorResource然後

  • 如果Actor actor = dao.create(new Actor(name,birthDate));ActorResource線31然後dao必須null和調用dao.create(…)使NullPointerException(這意味着dao尚未初始化);
  • 否則如果return new Saying("Added : " + actor.toString());ActorResource線31然後actor必須null和調用actor.toString()使NullPointerException(這意味着dao.create(…)返回null)。
+0

31線使用的唯一方法'返回新的諺語(「加:「+ actor.toString());'line。 那麼在'when(...)'時測試方法有問題嗎? – VanDavv

+0

然後'actor'是'null'這意味着'dao.create(...)'返回'null'。我建議添加一些日誌記錄和/或調試你的應用程序來找出原因。 – mfulton26

相關問題