- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在构建单元测试或测试用例方面并不是很有经验,现在我需要一些建议。我计划开设这门类(class),但我不确定单元测试的最佳方法是什么。我还没有写这个类,但它看起来像这样:
public class ClassName {
private ArrayList<Order> sortedOrderList1 = new ArrayList<>();
private ArrayList<Order> sortedOrderList2 = new ArrayList<>();
public void method1(Order order) {
//Modifies Order objects inside sortedOrderList1 or sortedOrderList2.
}
public method2(Order order) {
//Modifies Order objects inside sortedOrderList1 or sortedOrderList1.
}
}
Order
列表内的对象有 price
和quantity
。这些方法将进入列表并从 quantity
中减去。对于列表末尾的某些 Order 对象,还删除 quantity
的对象已达到0。
现在的问题是我不知道测试这些方法的最佳方法是什么。在我的 JUnit 类中,我将无法访问 private
列表,并且方法本身没有返回值供我检查。测试此类方法的最佳实践方式是什么?
最佳答案
您应该为这两个公共(public)方法创建单元测试。如果这些方法对作为参数传递的订单对象进行更改,那么您的单元测试应该对该对象进行断言。您还应该检查sortedOrderLists 的状态。
要获取这些排序的顺序列表来检查它们,您将遇到一些问题。以下是三种可能的解决方案。
如果由于某种原因您不能或不想更改类实现,则为第一个选项。您必须使用反射来获取对这些私有(private)字段的引用。
第二个选项是将这些字段的可见性更改为 protected 。然后在同一个包中创建单元测试类。现在可以直接获取这些排序的顺序列表。
第三种可能是最好的选择是对这些字段使用依赖注入(inject)。依赖注入(inject)有许多不同的选项。您可以使用 CDI 或 Spring 之类的东西。但为了简单起见,您可以只使用普通的 java setter 或构造函数注入(inject)。只是不要在类(class)中新建这些列表。由于您注入(inject)了这些列表,现在它们甚至可以是私有(private)的。您的单元测试类将创建列表并将它们注入(inject)到您的测试类中。现在您有了这些私有(private)字段的引用,并且可以使用断言来检查它们。
构造函数注入(inject)示例:
public class ClassName {
private ArrayList<Order> sortedOrderList1;
private ArrayList<Order> sortedOrderList2;
public ClassName(ArrayList<Order> sortedOrderList1, ArrayList<Order> sortedOrderList2) {
this.sortedOrderList1 = sortedOrderList1;
this.sortedOrderList2 = sortedOrderList2;
}
public void method1(Order order) {
//Modifies Order objects inside sortedOrderList1 or sortedOrderList2.
}
public method2(Order order) {
//Modifies Order objects inside sortedOrderList1 or sortedOrderList1.
}
}
单元测试示例:
import org.junit.Assert;
public class ClassNameTest {
public void testMethod1() {
ArrayList<Order> list1 = new ArrayList<>();
ArrayList<Order> list2 = new ArrayList<>();
Order order = new Order();
ClassName testMe = new ClassName(list1, list2);
testMe.method1(order);
// Insert your assertions for example:
Assert.assertTrue(list1.contains(order));
}
}
关于Java - 需要有关如何对此类进行单元测试的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36521196/
我是一名优秀的程序员,十分优秀!