鉴于您使用的是 Java,因此没有很好的方法可以做到这一点。原因是没有像在 Kotlin 中那样复制对象和更改一个或多个属性的好方法(请查看 here 了解更多详细信息)。
话虽如此,您有两个选择。
第一个是创建一个实际创建所有这些不同对象的实用程序类。是的,代码会被复制,但至少这种丑陋会隐藏在一个非常具体的文件中。
public class TestObjects {
public static Product productWithDescriptionContainingNoHtmlTags() {
Product product = new Product();
product.setName("ProductName");
product.setDescription("No HTML Tags");
return product;
}
public static Product productWithDescriptionContainingValidHtmlTags() {
Product product = new Product();
product.setName("ProductName");
product.setDescription("<p>Description</p>")
return product;
}
public static Product productWithDescriptionContainingInvalidHtmlTags() {
Product product = new Product();
product.setName("ProductName");
product.setDescription("<invalid>Description</invalid>")
return product;
}
}
然后在你的测试类中,你只需要在合适的地方使用这些方法。
第二个可能是向您的Product 类添加一个构造函数,该类同时接收name 和description:
public class Product {
private String name;
private String description;
public Product() { }
public Product(String name, String description) {
this.name = name;
this.description = description;
}
}
然后在您的测试类中,您可以执行以下操作来创建此类对象:
private Product productWithDescriptionContainingNoHtmlTags =
new Product("ProductName", "No HTML Tags");
private Product productWithDescriptionContainingValidHtmlTags =
new Product("ProductName", "<p>Description</p>");
private Product productWithDescriptionContainingInvalidHtmlTags =
new Product("ProductName", "<invalid>Description</invalid>");
附带说明,当您需要在不创建多个测试的情况下测试一些不同的场景时,一个不错的技巧是使用参数化测试。大致如下:
private static Stream<Arguments> products() {
return Stream.of(
Arguments.of(new Product("ProductName", "No HTML Tags"), true),
Arguments.of(new Product("ProductName", "<p>Description</p>"), true),
Arguments.of(new Product("ProductName", "<invalid>Description</invalid>"), false)
);
}
@ParameterizedTest
@MethodSource("products")
void assertProductsValidity(Product product, boolean isValid) {
// Your test here
}
查看https://www.baeldung.com/parameterized-tests-junit-5#6-method了解更多详情。