有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么这会给我AssertationError?

我有以下测试:

@Test
    public void deleteUser(){

        User user = new User("admin","admin");
        service.createUser(user);
        service.deleteUser(1);

        assertTrue("Check that user is deleted: ", user.getId() < 1);

    }

但它给了我AssertationError。 为什么我不能这样做? 我创建了我的用户,然后想测试我是否能够删除新创建的用户

我的delete方法只是从hashmap中删除用户

Map<Long, User> users = new HashMap<Long, User>();
    protected static long nextId = 0;

@Override
    public long createUser(User user) {

        user.setId(getNextId());
        users.put(user.getId(), user);

        return user.getId();
    }

    @Override
    public void deleteUser(long id) {

        users.remove(id);

    }

谁能给我解释一下吗


共 (3) 个答案

  1. # 1 楼答案

    您的测试没有任何意义——您想检查用户是否已从服务中删除,但您正在检查用户对象的Id属性的值(该属性为null,或设置为某个值——您没有提供任何代码)。正如一些用户已经建议的那样,您需要检查用户是否真的包含在您的服务中。另外,您是否在getNextId()方法中执行了一些操作?如果这只是nextId变量的getter,那么您创建的每个用户的Id都将设置为0(但也许您希望这样,谁知道呢)。getNextId中是否有一些代码实际将值设置为其他值

  2. # 2 楼答案

    与其访问User对象,您仍然有对该对象的引用(与它是否被删除无关),您应该实现一个方法,检查用户是否存在于服务变量的类中:

    public boolean containsUser(long userId) {
        return users.containsKey(userId);
    }
    

    然后这样断言:

    assertFalse("Check that user is deleted: ", service.containsUser(1L));
    
  3. # 3 楼答案

    Map删除用户时,对user.id不做任何操作。这就是你的断言失败的原因

    删除时更改id的一种方法

    @Override
    public void deleteUser(long id) {
        User deletedUser = users.remove(id);
        deletedUser.setId(-1);
    }
    

    另一种(也是更好的)方法是改变测试:

    @Test
    public void deleteUser(){
        User user = new User("admin","admin");
        long id = service.createUser(user);
        service.deleteUser(id);
    
        assertFalse("Check that user is deleted: ", service.hasUser(id));
    }