我正在学习Java并使用Mockito探索junit. 这个 idea 是为了了解在哪里以及如何使用mockito,并学习如何编写junit测试.我是一个初学者和学习者.

如何使用mockito为以下代码编写junit测试:

public class QueryBuilder<EntityT> {
private List<List<String>> allConditions;
private int top;
private int skip;
private FieldOrdering ordering;
private String tableName;

public QueryBuilder() {
    this.allConditions = new ArrayList<>();
    this.top = -1;
    this.skip = 0;
    this.ordering = new FieldOrdering();
    this.tableName = "your_table"; // Default table name
}

public QueryBuilder<EntityT> filter(FilterableExpression filters) {
    allConditions.add(filters.getConditions());
    return this;
}

public QueryBuilder<EntityT> and() {
    allConditions.get(allConditions.size() - 1).add(" AND ");
    return this;
}

public QueryBuilder<EntityT> or() {
    allConditions.get(allConditions.size() - 1).add(" OR ");
    return this;
}

public QueryBuilder<EntityT> top(int count) {
    this.top = count;
    return this;
}

public QueryBuilder<EntityT> skip(int count) {
    this.skip = count;
    return this;
}

public QueryBuilder<EntityT> orderBy(FieldOrdering ordering) {
    this.ordering = ordering;
    return this;
}

public QueryBuilder<EntityT> tableName(String tableName) {
    this.tableName = tableName;
    return this;
}

/**
 * build the query with the clauses addded to Filter Expression *
 * 
 * @return
 */
public String build() {
    StringBuilder query = new StringBuilder("SELECT * FROM " + tableName + " WHERE ");

    if (!allConditions.isEmpty()) {
        for (int i = 0; i < allConditions.size(); i++) {
            List<String> conditions = allConditions.get(i);
            for (int j = 0; j < conditions.size(); j++) {
                query.append(conditions.get(j));
                if (j < conditions.size() - 1 && !conditions.get(j + 1).equals(" AND ")
                        && !conditions.get(j + 1).equals(" OR ")) {
                    query.append(" ");
                }
            }
            if (i < allConditions.size() - 1) {
                query.append(" AND ");
            }
        }
    } else {
        query.append("1=1");
    }

    List<String> orderByList = ordering.getOrderByList();
    if (!orderByList.isEmpty()) {
        query.append(" ORDER BY ").append(String.join(", ", orderByList));
    }

    if (top > 0) {
        query.append(" LIMIT ").append(top);
    }

    if (skip > 0) {
        query.append(" OFFSET ").append(skip);
    }

    return query.toString();
}

}

任何帮助/建议都是非常感谢的.我想写测试,判断流程,了解一切是如何工作的.

先谢谢你.

推荐答案

为了使用Mockito为所提供的QueryBuilder类编写JUnit测试,我们将专注于测试它的行为,并确保它根据所提供的条件、top、skip、ordering和table name正确地构造SQL查询.

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;

public class QueryBuilderTest {

private QueryBuilder<EntityT> queryBuilder;
private FilterableExpression mockFilters;
private FieldOrdering mockOrdering;

@Before
public void setUp() {
    queryBuilder = new QueryBuilder<>();
    mockFilters = mock(FilterableExpression.class);
    mockOrdering = mock(FieldOrdering.class);
}

@Test
public void testBuildQuery() {
    when(mockFilters.getConditions()).thenReturn(List.of("condition1", "condition2"));
    when(mockOrdering.getOrderByList()).thenReturn(List.of("field1 ASC", "field2 DESC"));

    String query = queryBuilder
        .filter(mockFilters)
        .and()
        .filter(mockFilters)
        .top(10)
        .skip(5)
        .orderBy(mockOrdering)
        .tableName("my_table")
        .build();

    String expectedQuery = "SELECT * FROM my_table WHERE condition1 AND condition2 AND condition1 AND condition2 ORDER BY field1 ASC, field2 DESC LIMIT 10 OFFSET 5";
    assertEquals(expectedQuery, query);
}
}

Java相关问答推荐

@ EnableRouting注释在Kotlin项目中不工作

在Java中将Charsequence数组更改为String数组或List String<>

Oracle DUAL表上使用DDL时jOOQ问题的解析'

最小拓Flutter 排序的时间复杂度是多少?

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

给定Java枚举类,通过值查找枚举

JVM会优化这个数学运算吗?

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

Java组件项目中的JavaFX对话框国际化

协同 routine 似乎并不比JVM线程占用更少的资源

Java KeyListener不工作或被添加

如何使JOOQ渐变脚本不重新创建表未更改的类?

使用Java线程进行并行编程

如何使用我的RLE程序解决此问题

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换

为什么 Random() 的行为不符合预期?