2013-03-26 32 views
1

我需要做一个JUnit测试,检查是否可以从数据库中删除某些东西。我正在使用Play 2.1 Framework和内存数据库。如何测试JUnit(Play Framework)中的删除?

我试过assertNull(...),但失败了。然后我尝试了assertNotNUll(...)并通过了测试,但我不确定这是做这件事的最好方法还是它甚至可以确认删除。 有没有更好的方法来检查一个项目是否被删除?我应该查找对象并期望出现错误吗?

这里是我的代码(我也有一些@BeforeClass和@AfterClass代码,但它没有相关的我的问题):

@Test 
public void UserDelete(){ 
    // Test ID: 3 
    // creating a new user 
    User user = new User(); 
    user.id = (long) 4; 
    user.facebookId = "0000004"; 
    user.email = "[email protected]"; 
    user.name = "name4"; 
    user.save(); 

    // deleting the user 
    user.delete(); 

    // checking deletion 
    assertNotNull(user); 
} 
+1

你可以给我们一个关于user.delete()方法包含什么的提示吗?如果我在调用user.delete()时正确理解,则在数据库中执行删除操作。这意味着用户不受影响。你应该做的是尝试查询删除的用户的数据库,看看它被删除。除非在delete()方法中更改实例“user”,否则它永远不会为空。 – 2013-03-26 15:05:23

回答

0

一般来说,你平时都做这样的事情。当然这是一个粗略的例子,但它指出你应该使用像JPA这样的持久化解决方案来坚持你的域对象。

@Test(expected = WhateverObjectNotFoundException.class) 
public void removeUserTest(){ 
    User u = UserFactory.createTestUser(); 
    Long id = myEntityManager.persist(u); 
    assertNotNull(id); 
    myEntityManager.remove(u); 
    myEntityManager.findById(id); 
} 

在我看来,因为它没有任何意义要问的对象,因此删除本身你的问题是有点矛盾的User不应该负责其生命周期。

此解决方案稍后可以进行概括,以便在测试相同类型的行为时不必重新编写它。

+0

实际上,Play文档建议使用Active Record样式数据库访问。 – 2013-04-07 20:46:17

0

您应该在数据库中插入新对象,检查是否已插入,删除并检查是否已删除。最明显的方法是使用select count(*)来获取行数。

public class ApplicationTest extends WithApplication { 

    @Before 
    public void setup() { 
     start(fakeApplication(inMemoryDatabase("default-test"), fakeGlobal())); 
    } 

    @Test 
    public void UserModify() { 
     // create user (User extends Model) 
     User user = new User(); 
     user.setId(1); 
     user.setName("name1"); 
     user.save(); 

     int rowCount = Ebean.find(User.class).where().eq("id", 1).findRowCount(); 
     assertEquals(1, rowCount); 

     user.delete(); 

     rowCount = Ebean.find(User.class).where().eq("id", 1).findRowCount(); 
     assertEquals(0, rowCount); 
    } 
} 
相关问题