如何在JUnit(Play Framework)中测试删除?

时间:2013-03-26 14:57:12

标签: java frameworks junit playframework-2.1

我需要进行一个JUnit测试,检查是否可以从数据库中删除某些内容。我正在使用Play 2.1 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 = "test4@gmail.com";
    user.name = "name4";
    user.save();

    // deleting the user
    user.delete();

    // checking deletion
    assertNotNull(user);
}

2 个答案:

答案 0 :(得分: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不应该对其生命周期负责,因为要求对象删除自己是没有意义的,因此你的问题有些悖论。

稍后可以推广此解决方案,以便在测试相同类型的行为时不必再将其全部写入。

答案 1 :(得分:0)

您应该在DB中插入新对象,检查是否已插入,删除它并检查它是否已删除。最明显的方法是使用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);
    }
}