簡體   English   中英

模擬持久性類返回IllegalArgumentException

[英]Mock persistance class returns IllegalArgumentException

當我嘗試使用mock(Event.class)模擬類Event ,我得到了:

java.lang.IllegalArgumentException: Object: Mock for Event, hashCode: 640142691 is not a known entity type.

這是事件類:

@Entity
@Table(name = "event")
@XmlRootElement
public class Event implements Serializable {
    private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Basic(optional = false)
   @Column(unique = true, name = "id")
   private Integer eventId;

   @Basic(optional = false)
   @NotNull
   @Size(min=1, max=255)
   @Column(name = "title")
   private String eventTitle;

   @Basic(optional = false)
   @JoinColumn(name = "created_by", referencedColumnName = "id")
   @ManyToOne
   private User eventCreatedBy;

   @Basic(optional = false)
   @Column(name = "created")
   @Temporal(TemporalType.TIMESTAMP)
   private Date eventCreated;

   public Event() {
   }

   // getters and setters for all database fields

   @Override
   public int hashCode() {
       int hash = 0;
       hash += (eventId != null ? eventId.hashCode() : 0);
       return hash;
   }

   @Override
   public boolean equals(Object object) { 
       if (!(object instanceof Event)) {
           return false;
       }
       Event other = (Event) object;
       if ((this.eventId == null && other.eventId != null) || (this.eventId != null && !this.eventId.equals(other.eventId))) {
           return false;
       }
       return true;
   }

   @Override
   public String toString() {
       return "Event[ eventId=" + eventId + " ]";
   }

這是測試類:

public class EventTest {

   private static final Integer EVENT_ID = 1;
   private static final String EVENT_TITLE = "title";

   private EntityManager em;
   private EntityTransaction et;
   private EventServiceImpl eventService;

   @Before
   public void setUp() throws Exception {
       em = Persistence.createEntityManagerFactory("test").createEntityManager();
       et = em.getTransaction();
       eventService = new EventServiceImpl();
       eventService.em = em;

       Event event = mock(Event.class);

       et.begin();
       em.persist(event);
   }

   @After
   public void tearDown() throws Exception {
       em.close();
   }

   @Test
   public void getList() {
       List list = eventService.getList();
       Event data = (Event) list.get(0);

       assertEquals(1, list.size());
       assertEquals(EVENT_TITLE, data.getEventTitle());
   }

   @Test
   public void getById() {
       Event data = eventService.get(EVENT_ID);
       assertEquals(EVENT_ID, data.getEventId());
   }
}

有人知道如何處理嗎?

您正在嘗試保留Event的模擬,而不是其真實實例。 這是行不通的,因為,就像異常情況一樣,實體管理器無法將模擬的類型識別為實體。

如果要編寫集成測試,則應避免模擬,而應使用真實的類而不是模擬。 嘲笑更常用於使單元測試獨立於其他類。

Event event = new Event(); // Entity manager will recognize this as entity
...

et.begin();
em.persist(event);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM