有 Java 编程相关的问题?

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

java For循环和太多if-else如何测试

我有一个这样的代码

List insert;
List update;
List delete
for(SomeObject someObj : someObjects){
    if(isNew){
        insert.add()
    }
    else if(isUpdate){
        update.add();
    }
    if(isDelete){
        delete.add()
    }
}

//call update insert delete functions

问题是这段代码不稳定,因为update insert delete都是void方法。 我的问题是,我是否应该考虑循环遍历三次,然后获取列表来测试是否过滤每个类型的结果的逻辑都在工作?成本没有我预期的那么高<;列表中有100个元素


共 (2) 个答案

  1. # 1 楼答案

    你可以查一下

    (sum of lists sizes after) == (sum of lists sizes before) + someObjects.size();
    
  2. # 2 楼答案

    这里的关键是能够控制依赖项并访问该方法所作用的状态

    以下是一个例子,说明:

    interface SomeDao {
        void add(SomeObject object);
        void update(SomeObject object);
        void delete(SomeObject object);
    }
    
    class SomeDaoStub implements SomeDao {
        @Override public void add(SomeObject object) {}
        @Override public void update(SomeObject object) {}
        @Override public void delete(SomeObject object) {}
    }
    
    class SomeObject {
        private final boolean isNew;
        private final boolean isUpdated;
        private final boolean isDeleted;
        SomeObject(boolean isNew, boolean isUpdated, boolean isDeleted) {
            this.isNew = isNew;
            this.isUpdated = isUpdated;
            this.isDeleted = isDeleted;
        }
        public boolean isNew() {
            return isNew;
        }
        public boolean isUpdated() {
            return isUpdated;
        }
        public boolean isDeleted() {
            return isDeleted;
        }
    }
    
    public void doSomethingComplicatedWithListsInAForLoop(Iterable<SomeObject> someObjects, SomeDao dao) {
        for (SomeObject someObject : someObjects) {
            if (someObject.isNew()) {
                dao.add(someObject);
            } else if (someObject.isUpdated()) {
                dao.update(someObject);
            } else if (someObject.isDeleted()) {
                dao.delete(someObject);
            }
        }
    }
    
    @Test
    public void itDeletesObjectsMarkedToBeDeleted() {
        final List<SomeObject> actualDeletedObjects = new ArrayList<>();
        List<SomeObject> expectedDeletedObjects = Arrays.asList(
                new SomeObject(false, false, true),
                new SomeObject(false, false, true),
                new SomeObject(false, false, true)
        );
        SomeDao theDao = new SomeDaoStub() {
            @Override
            public void delete(SomeObject object) {
                actualDeletedObjects.add(object);
            }
        };
        doSomethingComplicatedWithListsInAForLoop(expectedDeletedObjects, theDao);
        assertEquals(expectedDeletedObjects, actualDeletedObjects);
    }
    

    我能弄清楚doSomethingComplicatedWithListsInAForLoop操作了什么的唯一原因是因为我能控制它的依赖关系,也就是说,在这个例子中,SomeDao

    您可能会发现测试方法很困难,因为它会调用无法注入的状态