我需要进行一个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);
}
答案 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);
}
}