gpt4 book ai didi

java - jUnit - 建议

转载 作者:行者123 更新时间:2023-12-02 05:39:10 27 4
gpt4 key购买 nike

我正在浏览 stackoverflow 以查找有关使用 jUnit 进行测试的常见建议,但仍然有几个问题。我知道,如果要测试的方法很复杂,最好的方法是将其分成小的单独部分并测试每个部分。但问题是 - 如果所有这些小部件都很容易理解并且我可以“直观地”测试它,为什么我应该这样做。我没有开发复杂应用程序的经验,这些应用程序涉及许多必须通过测试涵盖的方法,但我无法想象为什么测试提供明显结果的大型方法的部分是有用的。下一个问题是关于 DAO 方法测试。坦率地说,我也不明白如何测试它们。您能否看一下下面的代码片段并告诉我测试以下方法的方法?预先感谢您。

1.该方法可以测试什么?

public List<InvoicesBean> setPaymentStateInBean(List invoicesData, float sumBalance) {
float dueState;
float currentInvoiceAmount;
float sumBalanceAfterIteration = sumBalance;
String paymentState;

Collections.sort(invoicesData, new BeanSortByDate());

Iterator iterator = invoicesData.iterator();
while (iterator.hasNext()) {
InvoicesBean invoicesBean = (InvoicesBean) iterator.next();
dueState = getDueState(invoicesBean.getDueDate());
currentInvoiceAmount = invoicesBean.getAmount();
sumBalanceAfterIteration = sumBalanceAfterIteration - currentInvoiceAmount;
paymentState = getPaymentState(dueState, sumBalanceAfterIteration);
invoicesBean.setPaymentState(paymentState);
}
return invoicesData;
}

2.向数据库发出请求并返回所选数据列表的方法:

public List<InvoicesBean> getInvoicesData(String selectedContractor){
float sumBalance = getPaymentTotalAmount(selectedContractor);
List<InvoicesBean> invoicesDataWithPaymentsState;
PaymentStateOperations paymentStateOperations = new PaymentStateOperations();

try {
preparedStatement = connection.prepareStatement("SELECT invoice_num, date, due_date, amount FROM invoices WHERE contractor_id IN" +
"(SELECT contractor_id FROM contractors WHERE contractor_name=?)");
preparedStatement.setString(1, selectedContractor);
resultSet = preparedStatement.executeQuery();
invoicesData = new ArrayList<InvoicesBean>();
while (resultSet.next()) {
InvoicesBean invoicesBean = new InvoicesBean();
invoicesBean.setNumber(resultSet.getString(1));
invoicesBean.setDate(resultSet.getString(2));
invoicesBean.setDueDate(resultSet.getString(3));
invoicesBean.setAmount(resultSet.getFloat(4));
invoicesData.add(invoicesBean);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
invoicesDataWithPaymentsState = paymentStateOperations.setPaymentStateInBean(invoicesData, sumBalance);
return invoicesDataWithPaymentsState;
}

最佳答案

您希望通过测试来了解您在开发过程中没有破坏任何东西。当您编写单元测试时,是为了确保您的代码健壮,这意味着它可以优雅地失败或以正确的方式处理错误的输入。

平凡的函数可能不需要总是进行测试,但是如何在不平凡的方法和平凡的方法之间划清界限呢?这对于每个开发人员来说都是不同的,您应该注意不要测试的是语言本身,我想说类似这样的事情(这个例子很愚蠢,但只是为了证明一点):

public String areBothTrue(bool a, bool b) {
return a && b;
}

但是假设您有一个非常简单的方法,只需将两个整数相加,那么什么值得测试呢?

public int sum(int a, int b) {
return a+b;
}

这个方法总是会有一个可预测的结果,但是输入呢?假设输入是 Integer.MAX_NUM5,结果是什么(提示它不会是两个值的总和)?在这种情况下,重要的是这个方法的上下文是什么,如果它的目的只是像 Java 那样对两个整数求和那么它就完全没问题,但是如果它应该添加一个值(value),比方说在我的银行账户中,那么如果我非常富有,我很快就会成为一个非常贫穷的人。 :(

我想说的是,你不应该将单元测试视为测试你的函数是否做了它所做的事情,你应该测试的是它做了什么,它正确地做了什么,即使输入错误。

我不会过多地讨论您的代码片段,因为我不知道它们需要什么,但是如果您查看 getInvoicesData 您会发现,如果存在SQLException。这意味着您认为是列表的东西实际上是空的,因为您无法连接到数据库,这意味着您必须检查它。

TL;DR

测试您的方法的功能,以及它的功能正确

关于java - jUnit - 建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com